Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Freigeben einer Pointerstruktur (https://www.delphipraxis.net/135659-freigeben-einer-pointerstruktur.html)

Hybrid666 15. Jun 2009 15:20


Freigeben einer Pointerstruktur
 
Hi,

ich muss sagen das ist das erste mal das ich großartig mit Zeigern in Delphi arbeite, darum auch hier gleich eine Frage, zu der ich nach langem suchen auch keine antwort habe.

Ich habe die Folgende Pointerstruktur:
Delphi-Quellcode:
  PCommands = ^TCommands;
  TCommands = record
    KeyInput : Boolean;
    Input : TInputType;
    Parameter : String;
    Next : PCommands;
  end;

  PMakro = ^TMakro;
  TMakro = record
    TimeStamp : Integer;
    Commands : PCommands;
    Next : PMakro;
  end;
und habe auf einen Button eine ganz kleine Teststruktur angelegt:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  Anchor : PMakro;
begin
  new (Anchor);
  Anchor^.TimeStamp := 10;
  new (Anchor^.Commands);
  Anchor^.Commands^.KeyInput := True;
  FreeMakro (Anchor);
end;
und wollte testen, ob meine Freigabefunktionen funktionieren, sie arbeiten rekursiv und sollen eigentlich die listen von hinten nach vorne zerstören:

Delphi-Quellcode:
procedure TForm1.FreeMakro (Anchor : PMakro);
begin
  if Assigned (Anchor) then
  begin
    if Assigned (Anchor.Commands) then FreeCommands (Anchor.Commands);
    if Assigned (Anchor.Next) then FreeMakro (Anchor.Next);
    dispose (Anchor);
  end;
end;

procedure TForm1.FreeCommands (Anchor : PCommands);
begin
  if Assigned (Anchor) then
  begin
    if Assigned (Anchor.Next) then FreeCommands (Anchor^.Next); //  <---- HIER WIRD EINE AV AUSGELÖST
    dispose (Anchor);
  end;
end;
ich hab markiert wo ich eine AV bekomme, kann mir einer sagen was ich falsch gemacht habe?

Danke schonmal

MfG Hybrid666

ULIK 15. Jun 2009 15:25

Re: Freigeben einer Pointerstruktur
 
Wenn Du eine Struktur erzeugst, dann solltest Du die NEXT Felder in deinem Beispiel auf nil setzen. Sonst zeigen sie irgendwo hin.

Uli

quendolineDD 15. Jun 2009 15:28

Re: Freigeben einer Pointerstruktur
 
.Next ist nicht initialisiert und zeigt daher ins Nirvana.
Edit:
Und noch etwas. Zwar überprüfst du .Next mit Assigned, jedoch überprüft Assigned auch nur auf <> nil. Nun steht jedoch ein Wert <> nil in .Next und somit gibt Assigned true zurück. Daraus resultiert dann die AV.

Der.Kaktus 15. Jun 2009 15:30

Re: Freigeben einer Pointerstruktur
 
Hallo,
da es sich in Deinem Fall um eine verkettete Liste handelt, mußt Du am Ende anfangen den Speicher wieder freizugeben.

[Edit] Hatte einen Satz nicht gelesen Sorry :oops: [/Edit]

Hybrid666 15. Jun 2009 15:31

Re: Freigeben einer Pointerstruktur
 
Der.Kaktus:

Die Rekursion sorgt dafür, dass es am Ende anfängt ;)



und ja ihr habt recht, .next zeigt ins nirvana, 2 semester uni, immer wurde und eingeprügelt "initialisiert eure variablen"....irgendwie vergisst man sowas aber am ehesten ^^ danke!

himitsu 15. Jun 2009 15:34

Re: Freigeben einer Pointerstruktur
 
Zitat:

Zitat von Der.Kaktus
Hallo,
da es sich in Deinem Fall um eine verkettete Liste handelt, mußt Du am Ende anfangen den Speicher wieder freizugeben.

ja oder am Anfang und dann über eine Temp-Variable das aktuelle Objekt merken bzw. vorm Freigeben darin .Next zwischenspeichern.

Hybrid666 15. Jun 2009 20:05

Re: Freigeben einer Pointerstruktur
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Der.Kaktus
Hallo,
da es sich in Deinem Fall um eine verkettete Liste handelt, mußt Du am Ende anfangen den Speicher wieder freizugeben.

ja oder am Anfang und dann über eine Temp-Variable das aktuelle Objekt merken bzw. vorm Freigeben darin .Next zwischenspeichern.

nein muss ich nicht.

Ich prüfe ob das aktuelle element nicht nil ist, wenn ja, dann
... prüfe ob die unterliste PCommands existiert -> FreeCommand aufrufen
... prüfe ob .Next existiert, wenn ja, erst FreeMakro (Anchor.Next) aufrufen
dann erst Aktuelles element freigeben


das heißt, die rekursion ist so aufgebaut, das vor dem zerstören des aktuellen elements, erst das nächste zerstört wird, also muss ich nix mit temp elementen speichern oder ähnliches, es ist gewährt das das freigeben hinten anfängt, nicht vorne.

MfG

quendolineDD 15. Jun 2009 20:11

Re: Freigeben einer Pointerstruktur
 
Deswegen sprach er ja eine Variante an, welche nicht rekursiv ist.

omata 15. Jun 2009 20:13

Re: Freigeben einer Pointerstruktur
 
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  Anchor : PMakro;
begin
  new (Anchor);
  Anchor^.TimeStamp := 10;
  Anchor^.Next := nil;
  new (Anchor^.Commands);
  Anchor^.Commands^.KeyInput := True;
  Anchor^.Commands^.Next := nil;
  FreeMakro (Anchor);
end;

Hybrid666 16. Jun 2009 11:24

Re: Freigeben einer Pointerstruktur
 
Zitat:

Zitat von quendolineDD
Deswegen sprach er ja eine Variante an, welche nicht rekursiv ist.

oh, sorry, hatte das "oder" überlesen und mir ein und hingedacht :D mein fehler ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz