Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1156528209
Vidog
2006-08-25 21:50
2006.09.17
Функции


3-1152805342
juice
2006-07-13 19:42
2006.09.17
2 датасета и ApplyUpdates


15-1156691988
Konstantin555
2006-08-27 19:19
2006.09.17
Что означает сигнал компьютера в виде сирены?


15-1156451817
Ketmar
2006-08-25 00:36
2006.09.17
что-то вроде туториала по написанию шелла


15-1156226937
Некто
2006-08-22 10:08
2006.09.17
Воздушное охлаждение системного блока





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский