AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Freigeben einer Pointerstruktur

Ein Thema von Hybrid666 · begonnen am 15. Jun 2009 · letzter Beitrag vom 17. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#1

Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:20
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
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:25
Wenn Du eine Struktur erzeugst, dann solltest Du die NEXT Felder in deinem Beispiel auf nil setzen. Sonst zeigen sie irgendwo hin.

Uli
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:28
.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.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:30
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 [/Edit]
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#5

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:31
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.130 Beiträge
 
Delphi 12 Athens
 
#6

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 15:34
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#7

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 20:05
Zitat von himitsu:
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
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 20:11
Deswegen sprach er ja eine Variante an, welche nicht rekursiv ist.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Freigeben einer Pointerstruktur

  Alt 15. Jun 2009, 20:13
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;
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#10

Re: Freigeben einer Pointerstruktur

  Alt 16. Jun 2009, 11:24
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 mein fehler ^^
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr.
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