AGB  ·  Datenschutz  ·  Impressum  







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

Pointer-Adresse freigeben

Ein Thema von ford42 · begonnen am 12. Nov 2015 · letzter Beitrag vom 12. Nov 2015
Antwort Antwort
Seite 1 von 2  1 2      
ford42

Registriert seit: 2. Okt 2015
60 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Pointer-Adresse freigeben

  Alt 12. Nov 2015, 13:51
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 13:58
Dispose gibt die Datenstruktur frei. Der Pointer zeigt aber anschließend noch auf die Speicheradresse.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:01
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:03
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:10
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...
  Mit Zitat antworten Zitat
ford42

Registriert seit: 2. Okt 2015
60 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:11
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:14
Delphi-Quellcode:
 Node.links.rechts := Node.rechts;
 Node.rechts.links := Node.links;
 Dispode( Node);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:19
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;

Geändert von Mavarik (12. Nov 2015 um 14:23 Uhr)
  Mit Zitat antworten Zitat
ford42

Registriert seit: 2. Okt 2015
60 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:29
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?

Geändert von ford42 (12. Nov 2015 um 14:31 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Pointer-Adresse freigeben

  Alt 12. Nov 2015, 14:35
Nein, wir biegen die Zeiger um

Vorher:
Code:
   
    Node -> Node -> Node
... n-1  <-  n  <- n+1 ...
Nachher:
Code:
   
    Node -> Node
... n-1  <-  n+1 ...
Markus Kinzler
  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 05:50 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