Здравствуйте.
Столкнулся с некоторыми проблемами при создании объекта и массива этого-же объекта, конкретно - с манипуляцией элементов в массиве.
Объект содержит только энный набор данных и несколько функций "одиночной" обработки.
Код:
type
TCommand = class (TObject)
ComList: TStringList;
Error: Cardinal;
public
procedure AssignObjects (ObjArray: array of TObject) ;
procedure AssignStrings (Str: TStrings);
procedure AssignObjectsStrings (Str: TStrings);
constructor Create;
destructor Free;
end;
Далее формируются запчасти для массива и сам массив:
Код:
TCommandStackElement= record
Command: TCommand;
Time: TDateTime;
end;
TCommandStackElmt = array of TCommandStackElement;
PCommandStackElmt = ^TCommandStackElmt;
TCommandStack = class (TObject)
private
PCommandStack: PCommandStackElmt;
Created: Boolean; //проверка на "созданность"
FSize: Cardinal; //под сколько элементов уже выделено памяти
FCount: Cardinal; //количество занятых элементов
public
function AddNew (ICommand: TCommand): Boolean;
//и остальные функции обработки
На данный момент выделение памяти делаю по блочно (FSize всегда кратно 256 и не меньше FCount)
Код:
ReallocMem(PCommandStack,(FSize)*SizeOf(TCommandStackElement));
Вот здесь возникает 1я проблема - при быстром добавлении элементов, программа не успевает выделить очередной блок памяти и обработать текущую, что ведет к ошибкам. Как можно реанимировать пациента? (вводить в клас дополнительный буллин на состояние ReallocMem, или есть другие методы?)
2я проблема в добавлении элемента - для этого вызывается AddNew (ICommand: TCommand):
Код:
function TCommandStack.AddNew (ICommand: TCommand): Boolean;
var OldLength: Cardinal;
begin
try
Result:=True;
if FSetSize(Self.FCount+1) then
begin
Inc(FCount);
try
PCommandStack^[Self.FCount].Time:=Now;
PCommandStack^[Self.FCount].@Command:=@ICommand;
except
Result:=False;
PCommandStack^[Self.FCount].Command:= TCommand.create;
PCommandStack^[Self.FCount].Command:=ICommand;
end;
end;
except
end;
end;
Собственно конкретно эта конструкция неверна - PCommandStack^[Self.FCount].@Command:=@ICommand; явно дико воспринимается компилятором (аналог в эксепте - работает). Задумка передачи указателя - после передачи элемента в массив, он все равно тут-же освобождается. Соответственно проще отдать "руль", а не создавать с 0ля. Весь вопрос как это сделать - создавать массив указателей:
Код:
PCommandStackElement = ^TCommandStackElement;
TCommandStackElmt = array of ^PCommandStackElement;
PCommandStackElmt = ^TCommandStackElmt;
TCommandStack = class (TObject)
private
PCommandStack: PCommandStackElmt;
или есть какая-нибудь хитрая функция/процедура?