Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать массив в подпрограмму


yel ©   (2006-09-01 10:11:00) 

Здравствуйте, не подскажите, можно ли передавать массивы в подпрограммы? В частности, передаю динамический массив в процедуру и пытаюсь изменить его размер

procedure IncArray(Ar: array of string; ArLenght : integer);
Var TempAr : array of string;
   i : integer;
begin
 TempAr := Nil;
 SetLength (TempAr,ArLenght-1);
 for i := 0 to (ArLenght-1) do TempAr[i] := Ar[i];
 Ar := Nil;
 SetLength (Ar,ArLenght)
 for i := 0 to ArLenght do Ar[i] := TempAr[i];
end;


han_malign   (2006-09-01 11:27:00) [1]

гы, помоему товарищу проще дать "корректный" код:
procedure IncArray(Ar: TStringDynArray);
begin
    SetLength(Ar, Length(Ar) + 1);
end;

- а то может он и не знает, что, при изменении длинны динамического массива, предыдущее содержимое сохраняется...


default   (2006-09-01 11:03:00) [2]

jack128 ©   (01.09.06 11:00) [13]
это для .NET соместимой версии Delphi ? или нет?


jack128   (2006-09-01 11:00:00) [3]

Dmitrij_K   (01.09.06 10:46) [10]
в Delphi такого нет
но зато есть
for j:=Low(DynArray) to High(DynArray) do


в 2006 есть.

var
 s: string;
 arr: TStringDynArray;
begin
 for s in arr do ;
end;


default ©   (01.09.06 10:56) [11]
для любых типов поддерживающих интерфейс IEnumerable

в дельфи - для любых классов имеющим метод GetEnumerator


default   (2006-09-01 10:58:00) [4]

"foreach(object o  in AnyObject) {"
сорри за оффтопик, но некоторым думаю это интересно


default   (2006-09-01 10:56:00) [5]

MBo ©   (01.09.06 10:45) [9]
там круче
для любых типов поддерживающих интерфейс IEnumerable
я могу писать, например
foreach(object o AnyObject) {
  Console.WriteLine(o.ToString());
}
(правда можно выйти за границы при реализации интерфейса, но интерфейс реализуется один раз, а вот перебирать элементы какого-либо объекта можно много раз в коде)


Dmitrij_K   (2006-09-01 10:46:00) [6]


> а вот в некоторых языках есть конструкция foreach(для каждого)

в Delphi такого нет
но зато есть
for j:=Low(DynArray) to High(DynArray) do


MBo   (2006-09-01 10:45:00) [7]

>default ©   (01.09.06 10:39) [8]
>а вот в некоторых языках есть конструкция foreach(для каждого)
В последних версиях Delphi есть for.. in, но и без этого можно Low и High использовать во избежание ошибок


default   (2006-09-01 10:39:00) [8]

а вот в некоторых языках есть конструкция foreach(для каждого)
с ней гарантировано невозможно выйти за границы массива да и удобство присутствует, правда тип должен поддерживать определнный интерфейс чтобы программа знала порядок перечисления элементов


Ketmar   (2006-09-01 10:28:00) [9]

> [3] yel   (01.09.06 10:24)
для новичков, но не для неучей.


Dmitrij_K   (2006-09-01 10:28:00) [10]

А вот этой операцией когда-нить получишь AV
тк i в последнем обороте цикла больше длинны массива

SetLength (TempAr,ArLenght-1);
for i := 0 to (ArLenght-1) do TempAr[i] := Ar[i];


MBo   (2006-09-01 10:27:00) [11]

Объявить нужный тип
type  TMyArray = array of TMyType;
В объявлении процедуры использовать этот тип
procedure MyProc(Arr: TMyArray);
Почитать в хелпе о различии открытых и динамических массивов (open arrays), и о модификаторах параметров (var-параметры и т.д.)

P.S. Для данной задачи, наверно, стоит использовать TStringList, а не массив строк


yel   (2006-09-01 10:24:00) [12]

> о ужас. увидел способ изменения размера и незнание работы
> SetLength(), дальше читать неинтересно.
Конференция все-таки для новичков, я вопрос задал, а не историю интересную рассказал.

> Dmitrij_K   (01.09.06 10:19) [2]
Спасибо


Сергей М.   (2006-09-01 10:24:00) [13]


> yel   (01.09.06 10:11)


> передаю динамический массив


Не динамический массив ты передаешь, а открытыймассив.
А это две разные разницы.

Открытый массив передается в п/программу последовательной записью ее элементов в стек, именно этот факт делает невозможным изменение размеров массива.


Ketmar   (2006-09-01 10:19:00) [14]

о ужас. увидел способ изменения размера и незнание работы SetLength(), дальше читать неинтересно.


Dmitrij_K   (2006-09-01 10:19:00) [15]

uses Types;
...
proc (var Arr:TStringDynArray;...)
begin
SetLength(Arr, 696);
...


Наверх

Титульная страница Поиск, карта сайта Написать письмо