Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

передача в процедуру массива [D7, XP]


webpauk ©   (2012-04-05 12:53:00) 

type
 TStrArr: array[1..5] of String;

procedure DoSome(Value: TStrArr);
begin
 ...
end;

procedure MyProc;
begin
 DoSome(['Й', 'Ц', 'У', 'К', 'Е']); - выдает ошибку
end;

Подскажите как правильно передать в функцию массив


CRLF   (2012-04-05 17:21:00) [1]


> Медвежонок Пятачок ©   (05.04.12 16:55) [14]

фигня. у него только в примере строки односимвольные. и научитесь уже строки передавать как const. и массивы тоже.


Медвежонок Пятачок   (2012-04-05 16:55:00) [2]

procedure DoSome(Value: string);
begin
for i := 1 to length(value) do
end;

procedure MyProc;
begin
DoSome('ЙЦУКЕН');
end;


toropoff   (2012-04-05 16:49:00) [3]

если готовый код нехочется переписывать то делайте типа:

  function my(val: array of String): TStrArr;
  var
    i: Integer;
  begin
    for i := 0 to high(val) do result[i]:= val[i];

  end;
 
  ...

  DoSome( my( ['Й', 'Ц', 'У', 'К', 'Е'] ) );


webpauk   (2012-04-05 13:45:00) [4]


> begin...end ©   (05.04.12 13:30) [11]

элементы неизвестны... просто в качестве примера передал "йцуке"


begin...end   (2012-04-05 13:30:00) [5]

> webpauk ©   (05.04.12 13:19) [7]

Я так и не понял, элементы массива заранее (до выполнения программы) известны или нет. Если известны, то чем не устраивают открытые массивы? Хотя можно и без них:

const
 Arr: TStrArr = ('Ох,', 'тяжёлая', 'это', 'работа', '...');
begin
  DoSome(Arr)
end

А если элементы формируются уже на этапе выполнения программы, тогда о каком более изящном решении может идти речь?


webpauk   (2012-04-05 13:27:00) [6]

придется дописывать функцию:
function SetStrArr(const cArr: array of String): TStrArr;


Anatoly Podgoretsky   (2012-04-05 13:27:00) [7]

Тогда так
procedure DoSome(const Arr: array of const);


webpauk   (2012-04-05 13:19:00) [8]


> begin...end ©   (05.04.12 13:18) [5]

криво... жаль. теряется изящность


begin...end   (2012-04-05 13:19:00) [9]

> procedure DoSome(Arr: array of string)
procedure DoSome(Arr: TStrArr)


begin...end   (2012-04-05 13:18:00) [10]

> webpauk ©   (05.04.12 13:12) [4]

type
 TStrArr = array [1..5] of string;

procedure DoSome(Arr: array of string);
var
I: Integer;
begin
for I := Low(Arr) to High(Arr) do
  ShowMessage(Arr[I])
end;

var
 A: TStrArr;
begin
 A[1] := 'Что,';
 A[2] := 'и';
 A[3] := 'так';
 A[4] := 'не';
 A[5] := 'подходит?';
 DoSome(A)
end


CRLF   (2012-04-05 13:18:00) [11]

type
TStrArr: array[1..5] of String;

procedure DoSome(Value: TStrArr);
begin
...
end;

procedure MyProc;
var
 StrArr: TStrArr;
begin
StrArr[1] := 'Й';
StrArr[2] := 'Ц';
StrArr[3] := 'У';
StrArr[4] := 'К';
StrArr[5] := 'Е';
DoSome(StrArr); - не выдает ошибку
end;

P.S. Вообще-то общепринятый отступ -- два пробела.


webpauk   (2012-04-05 13:12:00) [12]


> begin...end ©   (05.04.12 12:59) [3]


абсолютно неподходящий вариант.
нужен именно мой вариант реализации procedure DoSome(Value: TStrArr);

как передать данные?


begin...end   (2012-04-05 12:59:00) [13]

procedure DoSome(Arr: array of string);
var
 I: Integer;
begin
 for I := 0 to High(Arr) do
   ShowMessage(Arr[I])
end

procedure MyProc;
begin
 DoSome(['Й', 'Ц', 'У', 'К', 'Е'])
end

См. в справке: Open array parameters, Open array constructors.


webpauk   (2012-04-05 12:57:00) [14]


> Подскажите как правильно передать в функцию массив


Плохиш   (2012-04-05 12:55:00) [15]


> procedure DoSome(Value: TStrArr);

Описан параметр типа статического массива

>  DoSome(['Й', 'Ц', 'У', 'К', 'Е']); - выдает ошибку
>

Предаётся открытый массив.
Правильно ошибку выдаёт.


Наверх

Титульная страница Поиск, карта сайта Написать письмо