Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer-Adresse freigeben (https://www.delphipraxis.net/187260-pointer-adresse-freigeben.html)

ford42 12. Nov 2015 12:51

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:
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 Dispose verwende, wird zwar der Pointer freigegeben(?), aber die Adresse (z.B. $2692B40) bleibt vorhanden.

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

mkinzler 12. Nov 2015 12:58

AW: Pointer-Adresse freigeben
 
Dispose gibt die Datenstruktur frei. Der Pointer zeigt aber anschließend noch auf die Speicheradresse.

Luckie 12. Nov 2015 13:01

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.

Klaus01 12. Nov 2015 13:03

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

Mavarik 12. Nov 2015 13:10

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...

ford42 12. Nov 2015 13:11

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

mkinzler 12. Nov 2015 13:14

AW: Pointer-Adresse freigeben
 
Delphi-Quellcode:
 Node.links.rechts := Node.rechts;
 Node.rechts.links := Node.links;
 Dispode( Node);

Mavarik 12. Nov 2015 13:19

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;

ford42 12. Nov 2015 13:29

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?

mkinzler 12. Nov 2015 13:35

AW: Pointer-Adresse freigeben
 
Nein, wir biegen die Zeiger um

Vorher:
Code:
   
    Node -> Node -> Node
... n-1  <-  n  <- n+1 ...
Nachher:
Code:
   
    Node -> Node
... n-1  <-  n+1 ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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