Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как в run-time задать границы массива


Автор: dm9 29.10.2003, 01:26
Возникла такая задача.
Приложение и dll работают с разделяемой памятью. Фактически разделяемая память является двухмерным массивом.
Но понятно, что разделяемая память - это всего лишь последовательность байт. Для того, чтобы мне было удобно работать с этой памятью, требуется сослаться на неё удобной мне структурой.
Например, если я заранее знаю размер матрицы, то это делается так:

Код
type
  TAr = array [0..1024, 0..1024] of Byte;
  PAr = ^TAr;
var
  PicAr : PAr;
begin
  ...
  PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
  ...
end;


Но в моей задаче размер заранее неизвестен.

Можно, конечно, работать с линейной структурой:

Код
type
  TLine = array [0..$7FFFFFFE] of Byte;
  PLine = ^TLine;
var
  PicAr      : PLine;
begin
  ...
  PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
  ...
end;


Но это крайне неудобно.

Как мне описать такую структуру, чтобы можно было работать с блоком разделяемой памяти как с двухмерным массивом, размеры оторого заранее неизвестны (они передаются в процедуру как параметры)?

Автор: cot 29.10.2003, 06:56
Задай двухмерный динамический TLine=Array of array of byte

Автор: Paradox 29.10.2003, 07:44
Код
var

 A : array of array of byte;
 I, J : Integer;
begin
 SetLength(A, 10);
 for I := Low(A) to High(A) do
 begin
   SetLength(A[I], I);
   for J := Low(A[I]) to High(A[I]) do
     A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
 end;
end;
например так... а вообще почитай по этому поводу топик dynamic arrays в справке по Delphi

Автор: p0s0l 29.10.2003, 10:15
Можно попробовать что-то вроде такого:
Код
type
 TLine = array [0..$7FFFFFFE] of Byte;
 PLine = ^TLine;
var
 PicAr      : PLine;
 DynArray : array of PLine;
 
procedure SetDimensions (d1, d2 : integer);
var
 i : integer;
begin
 SetLength (DynArray, d1);
 for i := 0 to d1-1 do DynArray[i] := PLine(cardinal(PicAr) + i*d2);
end;

begin
 ...
 PicAr := MapViewOfFile (Hnd, FILE_MAP_WRITE, 0, 0, 0);
 SetDimensions (1024, 2048); // задать размеры: 1024 строк, 2048 столбцов
 ...
// пример обращения к маccиву
 for y := 0 to 1023 do
  for x := 0 to 2047 do
    DynArray[y][x] := x+y;
// или
    DynArray[y, x] := x + y;
 ...
end;


SetDimensions задаёт размеры матрицы DynArray
Обращаться к матрице - как обычно: DynArray[y, x] := ...

Автор: dm9 29.10.2003, 14:26
p0s0l, большое спасибо за идею. Попробую сделать так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)