динамические массивы
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 15
- Зарегистрирован: 21 июн 2006, 20:15
- Контактная информация:
Подскажите начинающему чайнику, плззз...
Возможно ли в Дельфи создавать многомерные динамические массивы?
Если возможно, то каков синтаксис?
Пробую:
var
a : array of integer;
i, j, N, M : integer;
begin
N:=StrToInt(iEdit.Text);
M:=StrToInt(jEdit.Text);
SetLength.(a,N,M);
...
end;
Выдает ошибку.
А если то же самое сделать для одномерого массива, то, вроде как, работает....
Возможно ли в Дельфи создавать многомерные динамические массивы?
Если возможно, то каков синтаксис?
Пробую:
var
a : array of integer;
i, j, N, M : integer;
begin
N:=StrToInt(iEdit.Text);
M:=StrToInt(jEdit.Text);
SetLength.(a,N,M);
...
end;
Выдает ошибку.
А если то же самое сделать для одномерого массива, то, вроде как, работает....
хоть и крашенная, но почти блондинка, поэтому говорите, пожалуйста, медленней и попроще 

-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
Вариант 1 (GetMem):
Вариант 2 (SetLength):
Код: Выделить всё
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;
Код: Выделить всё
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;
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
ps: Если тип, например, Integer, тогда
Код: Выделить всё
for i:=0 to 9 do GetMem(a[i],10*SizeOf(Integer));
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
-
- Сообщения: 15
- Зарегистрирован: 21 июн 2006, 20:15
- Контактная информация:
Спасибо! Я поняла в чем дело!
a: array of array ...
я просто НЕдинамические массивы всегда задавала
"а: array[0...50,0...100] of... "
Поэтому и не подумала написать "array of array"..
А про GetMem я и не знала... пошла разбираться с этим способом - вдруг пригодится
a: array of array ...
я просто НЕдинамические массивы всегда задавала
"а: array[0...50,0...100] of... "
Поэтому и не подумала написать "array of array"..
А про GetMem я и не знала... пошла разбираться с этим способом - вдруг пригодится
хоть и крашенная, но почти блондинка, поэтому говорите, пожалуйста, медленней и попроще 

- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
:-0 а не FreeMem????//Освобождаем память
GetMem(a,0);

-
- Сообщения: 74
- Зарегистрирован: 10 май 2006, 12:19
- Откуда: Санкт-Петербург
- Контактная информация:
можно и так:
Код: Выделить всё
type
tArrItem = array of Integer;
var
arr: array of tArrItem;
begin
SetLength(arr,2);
SetLength(arr[0],10);
SetLength (arr[1],4);
end;
-
- Сообщения: 273
- Зарегистрирован: 30 июн 2005, 14:53
Я тоже так думаю, но на практике ошибку выдаетИгорь Акопян писал(а)://Освобождаем память
GetMem(a,0)]
:-0 а не FreeMem????
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Blood_Magic, ты не напутал насчет GetMem для динамических массивов?
Правильный вариант №2.
Правильный вариант №2.
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
Blood_Magic, может ошибка из-за того, что надо сначала поФриМемить в цикле все выделенные ранее элементы?
ЗЫ
Я бы доваил ещё 3-тий вариант собсно Variant
ЗЫ
Я бы доваил ещё 3-тий вариант собсно Variant


-
- Сообщения: 74
- Зарегистрирован: 10 май 2006, 12:19
- Откуда: Санкт-Петербург
- Контактная информация:
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;