Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
ВнизПередать массив в подпрограмму Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c