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