![]() |
Delphi-Version: 5
Pointer-Adresse freigeben
Hey,
ich sitze gerade an Binärbäume dran und bekomme es nicht hin, eine Adresse eines Pointers auf nil zu setzen/freizugeben. Folgende 2 Code-Ausschnitte dürften es klarer machen, was ich meine:
Code:
PNode = ^TNode;
TNode = record daten: String; links: PNode; rechts: PNode; end;
Code:
Wenn ich Dispose verwende, wird zwar der Pointer freigegeben(?), aber die Adresse (z.B. $2692B40) bleibt vorhanden.
procedure TForm4.Bt_LoeschenClick(Sender: TObject);
begin Dispose(PStandNode); //Pointer/record wird auf nil gesetzt, jedoch bleibt die Adresse vom Pointer vorhanden PStandNode := PWurzelNode; //LÖSCHEN NOCH RICHTIG IMPLEMENTIEREN Lb_Ausgabe.Caption := PStandNode.daten; StatusBt; end; Wenn ich jetzt in dem Baum navigiere, zeigt (z.B.) rechts weiterhin auf $2692B40, jedoch bekomme ich natürlich eine access-violation-Exception. Wie würdet ihr dies lösen, oder gibts dazu vlt sogar ne Methode, die mir da helfen könnte? :) Vielen Dank Gruß ford42 |
AW: Pointer-Adresse freigeben
Dispose gibt die Datenstruktur frei. Der Pointer zeigt aber anschließend noch auf die Speicheradresse.
|
AW: Pointer-Adresse freigeben
Das Objekt an dieser Adresse wird feigegeben. Wo soll denn die Adresse in verschwinden? Wenn du aus einem Haus ausziehst , gibt es die Adresse (Anschrift: Müllergasse 4) auch immer noch.
|
AW: Pointer-Adresse freigeben
Wenn Du einen Knoten löscht, musst Du den Nachbarknoten mitteilen, dass der Nachbar nicht mehr da ist - oder ein anderer geworden ist.
Grüße Klaus |
AW: Pointer-Adresse freigeben
OK man könnte Fragen, warum ein Record...
Bei einer Classe könntest Du FreeAndNil nehmen... Du könntest Dir auch die Instance in einer TObjectList speichern und ohne durch die Liste zu laufen alle löschen... Aber das muss jeder für sich selber entscheiden... |
AW: Pointer-Adresse freigeben
Ja, das ist mir soweit klar.
Nur suche ich gerade eine Möglichkeit, dass (wenn z.B. PWurzelNode.rechts.rechts.links.rechts.links gelöscht werden soll) PWurzelNode.rechts.rechts.links.rechts.links auf nil zeigt. Hätte ich noch einen Pointer, der auf das Elternelement(?) zeigt, dann wäre dies ja kein Problem, jedoch soll ich es ohne so einen Pointer lösen. EDIT: @Mavarik, sry deinen Beitrag, hab ich erst jetzt gesehen |
AW: Pointer-Adresse freigeben
Delphi-Quellcode:
Node.links.rechts := Node.rechts;
Node.rechts.links := Node.links; Dispode( Node); |
AW: Pointer-Adresse freigeben
Hierfür?
Delphi-Quellcode:
PNode = ^TNode; TNode = record daten: String; links: PNode; rechts: PNode; end; Function SucheNode(Const ARoot : PNode;Const ASucher : String) : PNode; begin Result := ARoot; While Result <> NIL do begin if Result.Daten = ASucher then exit; Result := Result.rechts; end; end; Procedure DelNode(TheNode : PNode); begin if TheNode = NIL then exit; if (TheNode.Links <> NIL) then TheNode.Links.Rechts := TheNode.Rechts; if (TheNode.Rechts <> NIL) then TheNode.Rechts.Links := TheNode.Links; Dispose(TheNode); TheNode := NIL; // Eigentlich egal... end; Procedure DelNodeFromText(Const AText : String); begin DelNode(SucheNode(Root,'Foo')); end; |
AW: Pointer-Adresse freigeben
Danke.
Aber ihr "löscht" nun einfach ALLE letzten Pointer (Mavarik nur die, die auf nil zeigen und den selben Wert haben wie der, den ich löschen will). Oder verstehe ich es gerade nicht richtig? |
AW: Pointer-Adresse freigeben
Nein, wir biegen die Zeiger um
Vorher:
Code:
Nachher:Node -> Node -> Node ... n-1 <- n <- n+1 ...
Code:
Node -> Node ... n-1 <- n+1 ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz