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

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

Многомерные open array parameters


Страницы:   1 2

Aldor ©   (2005-02-19 20:41:00) 

Возможо ли это? Как сделать что-то типа:

const
StaticArray: array [0..2] of array [0..2] of Integer = ((1, 1, 1),
                                  (1, 1, 1),
                                  (1, 1, 1));

procedure OpenParamProc(OpenArray: array of array of Integer);


Alexander Panov   (2005-02-20 22:59:00) [1]

Передавай структуру, в конце концов...
А внутри структуры можешь любые массивы определять.


Aldor   (2005-02-20 22:58:00) [2]

В сущности, это некоторое упрощение способа, предложенного GuAV.


Aldor   (2005-02-20 22:56:00) [3]


begin...end ©   (20.02.05 20:21) [19]
> А чем не устраивает существующий способ?


 Наглядность вводимого массива. И, в принципе, все.
 Хотя повысить наглядность можно так:
 в том же initialization
 
 procedure SetArray(Arr: TSomeDynArray; ColCount: Integer; Elements: array of const);

 ...

 SetArray(SomeArray, 3, [1, 2, 3,
                         4, 5, 6,
                         7, 8, 9]);
 


begin...end   (2005-02-20 20:21:00) [4]

> GuAV ©   (20.02.05 14:33) [17]

> Что ксается исходного вопроса, то IMHO нет, никак.
Вот и я о том же. А вместо нетипизированного параметра можно передавать, например, указатель.

> Aldor ©   (20.02.05 19:26) [18]

Если бы речь шла об одномерных массивах символов, то ещё один способ есть. В случае двумерных массивов, насколько я знаю, другого способа нет. А чем не устраивает существующий способ?


Aldor   (2005-02-20 19:26:00) [5]

Anatoly Podgoretsky ©   (20.02.05 11:44) [10]
> Откажись от открытых массивов в пользу динамических.


 А есть ли способ задавать "константые" массивы в модуле иначе как


initialization
 Arr[..,..] := ...;


?


GuAV   (2005-02-20 14:33:00) [6]

Что ксается исходного вопроса, то IMHO нет, никак.


GuAV   (2005-02-20 14:32:00) [7]

Конечно, Dynamic: Boolean..


GuAV   (2005-02-20 14:29:00) [8]

begin...end ©   (20.02.05 13:44) [14]

ОК,
procedure Z(var A; Dimentions: array of Integer; Dynamic: Variant);
begin
{
Код тоже делается. Для 2мерного - приводить к двумерному дин массиву. Для n-мерного - поледовательно разъыменовывать указатели.
}
end;


begin...end   (2005-02-20 13:44:00) [9]

> GuAV ©   (20.02.05 12:19) [11]
> GuAV ©   (20.02.05 13:23) [13]

Противоречит исходному вопросу, т.к. здесь A не является открытым массивом.


GuAV   (2005-02-20 13:23:00) [10]

procedure Z(var A; Dimentions: array of Integer);

 function CvtIdx(I: array of Integer): Integer;
 var Scale, ScaleIdx: Integer;
 begin
   Result := 0;
   Scale := 1;
   for ScaleIdx := High(I) downto Low(I) do
   begin
     Inc(Result, I[ScaleIdx] * Scale);
     Scale := Scale * Dimentions[ScaleIdx];
   end;
 end;

var
 M: array[0..MaxInt div SizeOf(Integer)] of Integer absolute A;
 X, i, j: Integer;

begin
 i:=1; j:= 2;

 // если всегда строго 2мерные
 X := M[i * Dimentions[1] + j];

 // в общем случае
 X := M[CvtIdx([i, j])];

 Form1.Caption := IntTOStr(X);

 // в цикле однако лучше использовать как одномерный массив.
end;


PS Для многомерных дин массивов работать не будет т.к. они являются массивами из дин массивов, а дин массив - это указатель.


jack128   (2005-02-20 12:30:00) [11]

GuAV ©   (20.02.05 12:19) [11]
А теперь предложи УДОБНЫЙ способ достучаться до элемента [i, j] в процедуре Z ;-)


GuAV   (2005-02-20 12:19:00) [12]

procedure Z(var A; Dimentions: array of Integer);
begin

end;

var X: array[0..1, 0..3] of Integer =
 ((1, 3, 7, 2), (2, 8, 3, 4));

procedure TForm1.FormCreate(Sender: TObject);
begin
 Z(X, [2, 4]);
end;


Anatoly Podgoretsky   (2005-02-20 11:44:00) [13]

Откажись от открытых массивов в пользу динамических.


Aldor   (2005-02-20 10:57:00) [14]

Странно, для одномерных можно, а для многомерных нельзя.
 Всем спасибо, буду линеаризировать.


jack128   (2005-02-20 10:39:00) [15]

Aldor ©   (19.02.05 20:52) [2]
причем как статические, так и динамические.

это не возможно.


begin...end   (2005-02-20 09:56:00) [16]

> Aldor ©   (19.02.05 20:41)
> Многомерные open array parameters
> Возможо ли это?

AFAIK, это невозможно.


Aldor   (2005-02-20 09:52:00) [17]

Alexander Panov ©   (19.02.05 22:22) [5]

К сожалению, статическиемассивы в эту процедуру не передать :(


Arr: array [0..1] of array [0..1] of Integer;


 С одномерными все хорошо, а вот как это провернуть с многомерными (кроме как линеаризировать их), не знаю.


Alexander Panov   (2005-02-19 22:22:00) [18]

type
 TArr=array of array of integer;

procedure tr(Parm: TArr);
begin
end;


Aldor   (2005-02-19 22:10:00) [19]

AndersoNRules

 Таким образом можно передавать только массив 2х2, а нужно any NxM


AndersoNRules   (2005-02-19 21:12:00) [20]

type
TBigWackoArray=  array [0..2] of array [0..2] of Integer;

procedure Proc(Ar:TBigWackoArray);
...


Страницы:   1 2

Наверх

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