Hiho,
ich versuche gerade meine
TObjList ein wenig zu beschleunigen und intern von einem Array of TObject auf Pointer umzusteigen. Allerdings hab ich irgendwo einen Fehler eingebaut, den ich einfach nicht finde.
Ich muss allerdings dazu sagen, dass ich eigentlich kaum mit Pointern arbeite und deshalb natürlich theoretisch auch an meinem Unwissen gescheitert sein könnte
Symptome:
Wenn ich verschiedene Objekte per Add hinzufüge bekomme ich, egal welchen Index ich übergebe, immer das zuletzt hinzugefügte Element zurück.
Hier mal der meiner Meinung nach relevate Code. Den kompletten Code hänge ich an.
Delphi-Quellcode:
type
PObject = ^TObject;
PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of PObject;
TObjList = class
private
FItems : PPointerList;
FOwnsObject : Boolean;
FLength : Integer;
FCapacity : Integer;
...
end;
implementation
constructor TObjList.Create(AOwnsObject: Boolean = True);
begin
inherited Create;
FOwnsObject := AOwnsObject;
FLength := 0;
FCapacity := 0;
end;
procedure TObjList.Grow;
var
Plus: Integer;
begin
if FCapacity > 64 then
Plus := FCapacity div 4
else
if FCapacity > 8 then
Plus := 16
else
Plus := 4;
SetCapacity(FCapacity + Plus);
end;
procedure TObjList.SetCapacity(aCapacity: Integer);
begin
if (aCapacity > FLength) and (aCapacity < MaxListSize) and
(aCapacity <> FCapacity) then
begin
ReallocMem(FItems, aCapacity * SizeOf(PObject));
FCapacity := aCapacity;
end;
end;
procedure TObjList.Add(AItem: TObject);
begin
if FLength = FCapacity then
Grow;
FItems^[FLength] := PObject(@AItem);
Inc(FLength);
end;
function TObjList.GetItem(AIndex: Integer): TObject;
begin
if (AIndex >= 0) and (AIndex < FLength) then
Result := FItems^[AIndex]^
else
Result := nil;
end;