Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Многомерные open array parameters   Найти похожие ветки 

 
Aldor ©   (2005-02-19 20:41) [0]

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

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-19 20:47) [1]

Определи свой тип и передавай свой тип параметром.


 
Aldor ©   (2005-02-19 20:52) [2]

Alexander Panov ©   (19.02.05 20:47) [1]
 Нужно в процедуру передавать массивы разных размерностей, причем как статические, так и динамические.


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

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

procedure Proc(Ar:TBigWackoArray);
...


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

AndersoNRules

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


 
Alexander Panov ©   (2005-02-19 22:22) [5]

type
 TArr=array of array of integer;

procedure tr(Parm: TArr);
begin
end;


 
Aldor ©   (2005-02-20 09:52) [6]

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

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


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


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


 
begin...end ©   (2005-02-20 09:56) [7]

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

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


 
jack128 ©   (2005-02-20 10:39) [8]

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

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


 
Aldor ©   (2005-02-20 10:57) [9]

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


 
Anatoly Podgoretsky ©   (2005-02-20 11:44) [10]

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


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

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;


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

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


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

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 Для многомерных дин массивов работать не будет т.к. они являются массивами из дин массивов, а дин массив - это указатель.


 
begin...end ©   (2005-02-20 13:44) [14]

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

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


 
GuAV ©   (2005-02-20 14:29) [15]

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

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


 
GuAV ©   (2005-02-20 14:32) [16]

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


 
GuAV ©   (2005-02-20 14:33) [17]

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


 
Aldor ©   (2005-02-20 19:26) [18]

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


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


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


?


 
begin...end ©   (2005-02-20 20:21) [19]

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

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

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

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


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


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]);
 


 
Aldor ©   (2005-02-20 22:58) [21]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.051 c
14-1107966063
Nic87
2005-02-09 19:21
2005.03.06
Новый дизайн сайта. Нужна конструктивная критика.


14-1107198468
Piter
2005-01-31 22:07
2005.03.06
Сюжет Half-Life


11-1090862232
DJ DIZzY
2004-07-26 21:17
2005.03.06
как сделать скин


6-1104163394
integerr
2004-12-27 19:03
2005.03.06
закачка на FTP файлов в потоке


3-1107428125
DSKalugin
2005-02-03 13:55
2005.03.06
Advantage Database Server