Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2011, 08:23   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию может ли функция возвратить массив?

хотел сделать функцию съедающую строчку чисел с разделителями и создающую в ответ массив
На моё
Код:
Function StrToArr(const s:string):Array of integer;
delphi ругается что ожидался identifier но найдено "Array"
Есть ещё другая идейка - сделать процедуру и передавать в неё ещё и имя массива, только я не дотумкал как это сделать, вот так я пробовал, не получилось:
Код:
Procedure StrToArr(const s:string; Name: TObject);
......
Name[i]:=xxx;
.......
подскажите пожалуйста что за тип будет у "Name" если я хочу передать в процедуру имя глобального массива и потом в него записывать значения
BoozZzilla вне форума Ответить с цитированием
Старый 25.03.2011, 09:21   #2
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Цитата:
Сообщение от BoozZzilla Посмотреть сообщение
...
Код:
Procedure StrToArr(VAR Name: array of integer; const s:string);
......
Name[i]:=xxx;
.......
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 25.03.2011, 10:18   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Хочу заметить, что можно и результат функции возвращать массив.
Только для этого нужно описать тип.
вот так, например:
Код:
type
  MyArrayType = Array of integer;

Function StrToArr(const s:string): MyArrayType ;
begin
  SetLength(Result,StrToInt(s));
end;

procedure TForm1.Button1Click(Sender: TObject);
var A : MyArrayType;
begin
  A := StrToArr('12');
end;
Хотя, в случае использования динамических массивов, решение через процедуру и массив, передаваемый через VAR параметр, мне лично БОЛЬШЕ нравится (ибо, ИМХО, это и нагляднее и надежнее).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2011, 10:49   #4
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

спасибо, реализовал второй вариант и всё работает
Второй вариант выбрал чтобы не заморачиваться с лишними массивами, т.к. может мне и не нужно всё это добро будет в глобальный массив ложить, я его сразу потреблю по назначению, А будет нужно так результат функции положу в глабальный массив.
Ещё раз спасибо

upd - оппа а в обычный массив то и не ложится

Последний раз редактировалось BoozZzilla; 25.03.2011 в 10:52.
BoozZzilla вне форума Ответить с цитированием
Старый 25.03.2011, 11:09   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> это и нагляднее и надежнее

нагляднее да, но надёжность там одинаковая, фактически result превращяется в неявный var параметр, и даже если результат функции ничему не присвоить, Дельфи сама добавит неявную переменную для передачи в качестве неявного параметра:

Код:
type
  TMyArray = array of Integer;

// --  --
procedure arrayViaVar(out v: TMyArray);
begin
{
004A0E2C 55               push ebp
004A0E2D 8BEC             mov ebp,esp
004A0E2F 83C4F8           add esp,-$08
004A0E32 8945F8           mov [ebp-$08],eax
004A0E35 8B45F8           mov eax,[ebp-$08]
004A0E38 85C0             test eax,eax
004A0E3A 7404             jz $004a0e40
004A0E3C 33D2             xor edx,edx
004A0E3E 8910             mov [eax],edx  // makes sure passed array is nil
}
  SetLength(v, 10);
{
004A0E40 6A0A             push $0a  // size
004A0E42 8B45F8           mov eax,[ebp-$08] // parameter
004A0E45 B901000000       mov ecx,$00000001 // dimentions
004A0E4A 8B15000E4A00     mov edx,[$004a0e00] // type info
004A0E50 E87371F6FF       call @DynArraySetLength
004A0E7A 83C404           add esp,$04
}
end;

// --  --
function arrayViaResult(): TMyArray;
begin
{
004A0E5C 55               push ebp
004A0E5D 8BEC             mov ebp,esp
004A0E5F 83C4F8           add esp,-$08
004A0E62 8945F8           mov [ebp-$08],eax // result as actually an implicit var parameter
}
  SetLength(result, 100);
{
004A0E65 6A64             push $64  // size
004A0E67 8B45F8           mov eax,[ebp-$08] // array
004A0E6A B901000000       mov ecx,$00000001 // dimentions
004A0E6F 8B15000E4A00     mov edx,[$004a0e00] // type info
004A0E75 E84E71F6FF       call @DynArraySetLength
004A0E7A 83C404           add esp,$04
}
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  A: TMyArray; // A will be set to nil in prologue!
begin
  //
  arrayViaVar(A);
{
004A0EA6 8D45F8           lea eax,[ebp-$08]         // offset to A, A is set to nil in prologue
004A0EA9 8B15000E4A00     mov edx,[$004a0e00]     // type info
004A0EAF E82071F6FF       call @DynArrayClear
004A0EB4 E873FFFFFF       call arrayViaVar          // expects offset to array in EAX
}

  arrayViaResult();
{
004A0EB9 8D45F0           lea eax,[ebp-$10]     // offset to implicit local variable of type TMyArray
004A0EBC E89BFFFFFF       call arrayViaResult    // expects offset to array in EAX
}

end;
как видно, вариант с result генерит более компактный код.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.03.2011, 11:22   #6
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

но как мне после реализации этого безобразия в виде функции положить результат в обычный массив? компилятор ругается что несовместимые типы если я просто вот так делаю:
Код:
var
MyArray: array of integer
.....
MyArray:=StrToArr('1,2,3')
или мне использовать потом по всей программе описаный ранее TMyArray вместо обычного? Тогда я насколько понимаю нужно и методы все описывать, я прав?

Последний раз редактировалось BoozZzilla; 25.03.2011 в 11:25.
BoozZzilla вне форума Ответить с цитированием
Старый 25.03.2011, 11:26   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

var
MyArray: MyArrayType
.....
MyArray:=StrToArr('1,2,3')
mss вне форума Ответить с цитированием
Старый 25.03.2011, 11:36   #8
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Спасибо, теперь всё работает
просто выходит везде где мне нужно будет использовать массивы пересекающиеся с этой функцией я использую свой тип
BoozZzilla вне форума Ответить с цитированием
Старый 25.03.2011, 12:29   #9
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Продолжая изыски попробовал первый вариант
процедура объявляется как было мне посоветовано:
Код:
 procedure StrToArr(var ArrName: array of integer; const s: string);
код тот же самый, но вот это компилятор не кушает:
Код:
 SetLength(ArrName,xx)
Ругается что inompatible types
без динамического изменения длины массива как то не представляю себе эту процедуру.

У меня есть переменная, процедура знает что это динамический массив - почему она не хочет кушать эту строчку?

upd- если это важно, запускается процедура так:
Код:
var
sss: array of integer;
...
StrToArr(sss,'1,2,3');

Последний раз редактировалось BoozZzilla; 25.03.2011 в 12:32.
BoozZzilla вне форума Ответить с цитированием
Старый 25.03.2011, 12:35   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> Ругается что inompatible types

И правильно ругается.
Открытый массив - далеко не тоже самое что и динамический массив.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция возвращает массив Рик Общие вопросы Delphi 5 22.03.2011 09:07
Может ли функция возвращать массив? TzX Общие вопросы Delphi 4 20.09.2010 19:27
какая функция может вывести максимальное значение Double, Single, Extended, Real? _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 14 14.07.2010 05:50
Как возвратить фокус? Кинельски Общие вопросы Delphi 1 12.06.2010 17:46
Как в функции возвратить 2 значения? Etlau Помощь студентам 4 20.06.2008 21:27