Страница 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;