Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизДиманический массив как поле класса Найти похожие ветки
← →
ranetka (2004-10-17 02:51) [0]Хотелось бы использовать динамический массив как поле класса. Т.е. я не знаю заранее, сколько элементов мне понадобится занести в этот массив( что-то вроде класса-контейнера в с++ ). Вопрос - как бы это было удобнее реализовать на Object Pascal?
← →
Добрый дядька (2004-10-17 02:53) [1]А в чем проблема?
TMyClass=class
FArray: array of Integer;
end
← →
ranetka © (2004-10-17 17:27) [2]Дело в том, что когда второй раз изменяю размер этого массива с помощью SetLength(..), то появляется ошибка обращения к памяти.
← →
Добрый дядька (2004-10-17 17:28) [3]>ranetka © (17.10.04 17:27) [2]
Ну что тут можно сказать. Ошибка в программе.
← →
ranetka © (2004-10-17 17:40) [4]>Добрый дядька (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;
← →
begin...end © (2004-10-17 17:47) [5]
> [4] ranetka © (17.10.04 17:40)
Выход за границы массива... Даже не смешно...
← →
ranetka © (2004-10-17 19:32) [6]
> begin...end © (17.10.04 17:47) [5]
Я, наверно, совсем глупая. Где здесь выход за границы?
← →
olookin © (2004-10-17 19:34) [7][6] ranetka © (17.10.04 19:32)
А ведь он (begin..end) прав. Вот тут
SetLength(tmp,VarCount);
for i:=0 to VarCount(а надо бы VarCount-1) do
tmp[i]:=Variables[i];
← →
default © (2004-10-17 20:10) [8]не
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. при увеличении длины массива неопределённые значения находятся только в добавленных элементах остальные как были
← →
ranetka © (2004-10-20 22:42) [9]спасибо, все работает. В след раз буду внимательнее
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c