Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Передать массив в подпрограмму   Найти похожие ветки 

 
yel   (2006-09-01 10:11) [0]

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

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;


 
Ketmar ©   (2006-09-01 10:19) [1]

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


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

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


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

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

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


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


> yel   (01.09.06 10:11)


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


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

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


 
MBo ©   (2006-09-01 10:27) [5]

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

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


 
Ketmar ©   (2006-09-01 10:28) [6]

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


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

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

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


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

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


 
MBo ©   (2006-09-01 10:45) [9]

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


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


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

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


 
default ©   (2006-09-01 10:56) [11]

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


 
default ©   (2006-09-01 10:58) [12]

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


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

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 11:03) [14]

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


 
han_malign ©   (2006-09-01 11:27) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
6-1138091589
Makhanev
2006-01-24 11:33
2006.09.17
получение MAC адресов сетевых карт в offline


15-1156616467
batya17
2006-08-26 22:21
2006.09.17
каую прогу посоветуете для создание инсталяшек?


2-1157042328
Sele
2006-08-31 20:38
2006.09.17
запуск с параметром


15-1156851900
Zhekson
2006-08-29 15:45
2006.09.17
File Access Denied


2-1157011441
Pupkin
2006-08-31 12:04
2006.09.17
Как определить текущее состоние звукового канала (muted/demuted)