Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1108475807
syte_ser78
2005-02-15 16:56
2005.03.06
mainmenu


3-1107433780
Floppy
2005-02-03 15:29
2005.03.06
ODBC, MSAccess, Alias


4-1106135217
tradakad
2005-01-19 14:46
2005.03.06
WM_KEYDOWN = Shift + Tab?


8-1100784763
Axer
2004-11-18 16:32
2005.03.06
Функции библиотеки bass.dll


1-1108989467
qwerr
2005-02-21 15:37
2005.03.06
Дочерние окна !!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский