Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Pointer/Cardinal-Casterei beenden

  Alt 27. Jul 2007, 09:00
Hallo Bug,

solltest du beim Anfordern/Freigeben des Speichers den Wert size nicht mit der Elementgröße (=SizeOf(Word)) multiplizieren? Oder gibt size gar nicht die Anzahl der Elemente sondern die Arraygröße in Bytes an?

Das interne Feld size wird im Konstruktor nicht initialisiert.

Dein Pointer-Problem kannst du ganz einfach umgehen, indem du das Feld data direkt als Zeiger auf ein Array vereinbarst:

Delphi-Quellcode:
type
  // möglicherweise auch bei Delphi3 schon in SysUtils vereinbart...
  PWordArray = ^TWordArray;
  TWordArray = array [0..(MaxInt div SizeOf(Word)) - 1] of Word;

  TDynArray = class
  private
    FCapacity : Cardinal;
    FData : PWordArray;
  public
    constructor Create (Capacity: Cardinal);
    destructor Destroy; override;
    function GetWord (Index: Cardinal): Word;
  end;

constructor TDynArray.Create (Capacity: Cardinal);
begin
  inherited Create;
  GetMem (FData, Capacity * SizeOf(Word));
  FCapacity := Capacity;
end;

destructor TDynArray.Destroy;
begin
  FreeMem (FData, FCapacity * SizeOf(Word));
  inherited;
end;

function TDynArray.GetWord (Index: Cardinal): Word;
begin
  Result := FData[Index];
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat