Страница 1 из 2

динамические массивы

Добавлено: 21 июн 2006, 20:22
чайничек с крышечкой...
Подскажите начинающему чайнику, плззз...
Возможно ли в Дельфи создавать многомерные динамические массивы?
Если возможно, то каков синтаксис?

Пробую:

var
a : array of integer;
i, j, N, M : integer;
begin
N:=StrToInt(iEdit.Text);
M:=StrToInt(jEdit.Text);
SetLength.(a,N,M);
...
end;

Выдает ошибку.

А если то же самое сделать для одномерого массива, то, вроде как, работает....

Добавлено: 22 июн 2006, 11:35
Blood_Magic
Вариант 1 (GetMem):

Код: Выделить всё

implementation
var
  a : array of array of byte;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,v:integer;
begin
  randomize;
  //Заполняем
  for i:=0 to 9 do
    for j:=0 to 9 do
      a[i,j]:=Random(256);
  label1.Caption:='';
  //Выводим
  for i:=0 to 9 do
    begin
      for j:=0 to 9 do label1.Caption:=label1.Caption+IntToStr(a[i,j])+' ';
      label1.Caption:=label1.Caption+#13#10;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
begin
  //Выделяем память
  GetMem(a,10);
  for i:=0 to 9 do GetMem(a[i],10);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Освобождаем память
  GetMem(a,0);
end;
Вариант 2 (SetLength):

Код: Выделить всё

procedure TForm1.Button2Click(Sender: TObject);
var
  a : array of array of byte;
  i,j:integer;
begin
  randomize;
  SetLength(a,10,10);
  //Заполняем
  for i:=0 to 9 do
    for j:=0 to 9 do
      a[i,j]:=Random(256);
  label1.Caption:='';
  //Выводим
  for i:=0 to 9 do
    begin
      for j:=0 to 9 do label1.Caption:=label1.Caption+IntToStr(a[i,j])+' ';
      label1.Caption:=label1.Caption+#13#10;
    end;
  SetLength(a,0,0);
end;

Добавлено: 22 июн 2006, 11:40
Blood_Magic
ps: Если тип, например, Integer, тогда

Код: Выделить всё

 for i:=0 to 9 do GetMem(a[i],10*SizeOf(Integer));

Добавлено: 22 июн 2006, 11:55
чайничек с крышечкой...
Спасибо! Я поняла в чем дело!
a: array of array ...

я просто НЕдинамические массивы всегда задавала
"а: array[0...50,0...100] of... "
Поэтому и не подумала написать "array of array"..

А про GetMem я и не знала... пошла разбираться с этим способом - вдруг пригодится

Добавлено: 22 июн 2006, 12:15
Игорь Акопян
//Освобождаем память
GetMem(a,0);
:-0 а не FreeMem????

Добавлено: 22 июн 2006, 12:35
vunder
можно и так:

Код: Выделить всё

type
  tArrItem = array of Integer;

var
  arr: array of tArrItem;
begin
  SetLength(arr,2);
  SetLength(arr[0],10);
  SetLength (arr[1],4);
end;

Добавлено: 22 июн 2006, 12:58
Blood_Magic
Игорь Акопян писал(а):
//Освобождаем память
GetMem(a,0)]
:-0 а не FreeMem????
Я тоже так думаю, но на практике ошибку выдает

Добавлено: 22 июн 2006, 20:53
Eugie
Blood_Magic, ты не напутал насчет GetMem для динамических массивов?
Правильный вариант №2.

Добавлено: 23 июн 2006, 10:54
Игорь Акопян
Blood_Magic, может ошибка из-за того, что надо сначала поФриМемить в цикле все выделенные ранее элементы?
ЗЫ
Я бы доваил ещё 3-тий вариант собсно Variant :)

Добавлено: 23 июн 2006, 12:38
vunder
RTFM!!! (Delphi Help)

Код: Выделить всё

var

  A: Variant;
begin
  A := VarArrayCreate([0, 4], varVariant);
  A[0] := 1;
  A[1] := 1234.5678;
  A[2] := 'Hello world';
  A[3] := True;
  A[4] := VarArrayOf([1, 10, 100, 1000]);
  WriteLn(A[2]);	{ Hello world }
  WriteLn(A[4][2]);	{ 100 }

end;