![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать массив в подпрограмму
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);
...