Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
2-1156832949
Pok
2006-08-29 10:29
2006.09.17
Определение пути к моему безоконному приложению


3-1151673867
Juice
2006-06-30 17:24
2006.09.17
Ошибка: dbexpress error 0x0005 operation not supported


10-1123495556
Nick Denry
2005-08-08 14:05
2006.09.17
Можно ли средсвами TMediaPLayer


8-1141606095
KALqYAN
2006-03-06 03:48
2006.09.17
Skins


11-1130388459
Trubis
2005-10-27 08:47
2006.09.17
Ещё вопросы (надеюсь последние) по ListView




   Наверх