![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Диманический массив как поле класса [D6, WinXP]
ranetka © (2004-10-17 02:51:00)Хотелось бы использовать динамический массив как поле класса. Т.е. я не знаю заранее, сколько элементов мне понадобится занести в этот массив( что-то вроде класса-контейнера в с++ ). Вопрос - как бы это было удобнее реализовать на Object Pascal?
ranetka (2004-10-20 22:42:00) [1]спасибо, все работает. В след раз буду внимательнее
default (2004-10-17 20:10:00) [2]не
function VM.AddOperand (op:string):boolean;
var tmp:array of Variable;
i,j:integer;
begin
if VarCount>0 then begin // изменяем размер массива не первый раз
SetLength(tmp,VarCount);
for i:=0 to VarCount do
tmp[i]:=Variables[i];
inc(VarCount);
SetLength(Variables,VarCount);
for i:=0 to VarCount-1 do
Variables[i]:=tmp[i];
Variables[i+1].name:=op;
end
else begin
inc(VarCount);
SetLength(Variables,VarCount);
Variables[0].name:=op;
end;
а
function VM.AddOperand (op:string):boolean;
begin
Inc(VarCount);
SetLength(Variables, VarCount);
Variables[High(Variables)].Name := op;
end;
P.S. при увеличении длины массива неопределённые значения находятся только в добавленных элементах остальные как были
olookin (2004-10-17 19:34:00) [3][6] ranetka © (17.10.04 19:32)
А ведь он (begin..end) прав. Вот тут
SetLength(tmp,VarCount);
for i:=0 to VarCount(а надо бы VarCount-1) do
tmp[i]:=Variables[i];
ranetka (2004-10-17 19:32:00) [4]
> begin...end © (17.10.04 17:47) [5]
Я, наверно, совсем глупая. Где здесь выход за границы?
begin...end (2004-10-17 17:47:00) [5]
> [4] ranetka © (17.10.04 17:40)
Выход за границы массива... Даже не смешно...
ranetka (2004-10-17 17:40:00) [6]>Добрый дядька (17.10.04 17:28) [3]
Кусочек кода:
VM = class
private
Variables : array of variable;// variable = record
VarCount : integer;
public
function AddOperand (op:string):boolean;
end;
function VM.AddOperand (op:string):boolean;
var tmp:array of Variable;
i,j:integer;
begin
if VarCount>0 then begin // изменяем размер массива не первый раз
SetLength(tmp,VarCount);
for i:=0 to VarCount do
tmp[i]:=Variables[i];
inc(VarCount);
SetLength(Variables,VarCount);
for i:=0 to VarCount-1 do
Variables[i]:=tmp[i];
Variables[i+1].name:=op;
end
else begin
inc(VarCount);
SetLength(Variables,VarCount);
Variables[0].name:=op;
end;
end;
Добрый дядька (2004-10-17 17:28:00) [7]>ranetka © (17.10.04 17:27) [2]
Ну что тут можно сказать. Ошибка в программе.
ranetka (2004-10-17 17:27:00) [8]Дело в том, что когда второй раз изменяю размер этого массива с помощью SetLength(..), то появляется ошибка обращения к памяти.
Добрый дядька (2004-10-17 02:53:00) [9]А в чем проблема?
TMyClass=class
FArray: array of Integer;
end