Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизМногомерные 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c