Delphi-PRAXiS

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

ford42 12. Nov 2015 13:54

AW: Pointer-Adresse freigeben
 
Aber Mavarik geht doch zum Elternelement, indem er nach dem Pointer sucht, der in Result.daten den selben Wert wie in ASucher hat und dann den vorherigen Pointer nimmt.

Aber wenn es ejtzt z.B. 2 mal die selbe Zahl (nehmen wir mal 6) gibt, dann wird ja vlt die "falsche" 6/Pointer gelöscht/abgezwickt oder nicht?

mkinzler 12. Nov 2015 14:01

AW: Pointer-Adresse freigeben
 
Wenn es wirklich mehrere identische Knoten geben sollte, dann wäre es doch egal, welcher davon gelöscht wird.

Zudem nimmt er nicht den Vorgänger sondern schiebt den Zeiger weiter. Der zeigt am Anfang auf das Wurzellement und wird im Fall das das Zielelement noch nicht erreicht ist auf das nächste Element gesetzt.

Mavarik 12. Nov 2015 15:01

AW: Pointer-Adresse freigeben
 
Zitat:

Zitat von ford42 (Beitrag 1321312)
Aber wenn es ejtzt z.B. 2 mal die selbe Zahl (nehmen wir mal 6) gibt, dann wird ja vlt die "falsche" 6/Pointer gelöscht/abgezwickt oder nicht?

Gut... Wenn Deine Einträge nicht eineindeutig sind, muss du halt nach einem anderen Kriterium suchen...

Darum ging es ja nicht...


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