Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Destruktor für verkettete Liste (https://www.delphipraxis.net/206595-destruktor-fuer-verkettete-liste.html)

Teesäufer 10. Jan 2021 20:10


Destruktor für verkettete Liste
 
Hallo zusammen,

ich bin mit Delphi leider noch nicht so ganz warm geworden. Als ich mir mal ein gutes Buch dazu kaufen wollte waren die alle nicht mehr im Handel. Keine Ahnung, warum.

Auf jeden Fall möchte ich eine verkettete Liste programmieren.

Delphi-Quellcode:
TListe = class
    private
    inhalt: string;
    next: Tliste;
    public
    constructor create(wert: string);
    destructor destroy; override;
    function gibmirinhalt: string;

  end;
Mit dem Destruktor habe ich noch meine Probleme. So sieht er momentan aus:
Delphi-Quellcode:
destructor TListe.destroy;
var loeschzeiger: TListe;
begin
  if next<>nil then
    next.destroy;
  inherited;


end;
Wenn ich das im Debugger verfolge stelle ich aber fest, dass nach dem Destroy die Elemente aber noch vorhanden sind. Was mache ich falsch?

stahli 10. Jan 2021 20:22

AW: Destruktor für verkettete Liste
 
Herzlich willkommen erst mal. :-)

Grundsätzlich musst Du für die Freigabe eines Objektes Obj.Free oder besser FreeAndNil(Obj) aufrufen.
Der Destructor übernimmt dann nur Aufgaben des internen Aufräumens.

Schau mal, ob Dir das schon weiter hilft, ansonsten einfach nochmal fragen...

Teesäufer 10. Jan 2021 20:35

AW: Destruktor für verkettete Liste
 
Scheint geklappt zu haben, vielen Dank! Und danke auch für die freundliche Aufnahme! Ich bin nur in einem Punkt unsicher: Ich hatte zwei Objekte von TListe, die aber auf dieselben Elemente gezeigt hatten. Als ich den ersten mit Freeandnil freigegeben hatte, stand im Debugger tatsächlich nil, beim anderen stand noch eine Adresse. Hat der dann noch irgendwo ins Nirwana auf ein nichtvorhandenes Objekt gezeigt oder war das Objekt dann doch nicht so richtig gelöscht? Ich will ja nicht den Speicher vollmüllen.

Andreas13 10. Jan 2021 21:14

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1480698)
...Als ich mir mal ein gutes Buch dazu kaufen wollte waren die alle nicht mehr im Handel. Keine Ahnung, warum.

Hallo Teesäufer,
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

Ein exzellentes Fachbuch, welches die verketteten Listen verständlich und praxisbezogen behandelt, kann ich Dir wie folgt empfehlen:
Doberenz, W. und Kowalski, Th.: Borland Delphi 7 - Grundlagen und Profiwissen aus dem Jahr 2003.

Es ist im Zentralen Verzeichnis Antiquarischer Bücher (www.zwab.com) noch recht günstig zu haben:
https://www.zvab.com/servlet/BookDet...-srp1-_-image2

Das Buch ist zwar "alt", aber die vermittelten Kenntnisse sind zeitlos und funktionieren auch bei neueren Delphi-Versionen.
Viel Erfolg!
Gruß, Andreas

Teesäufer 10. Jan 2021 21:59

AW: Destruktor für verkettete Liste
 
Hallo Andreas,

Zitat:

Zitat von Andreas13 (Beitrag 1480701)
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

die portable Version 5.

Zitat:

Zitat von Andreas13 (Beitrag 1480701)
Ein exzellentes Fachbuch, welches die verketteten Listen verständlich und praxisbezogen behandelt, kann ich Dir wie folgt empfehlen:
Doberenz, W. und Kowalski, Th.: Borland Delphi 7 - Grundlagen und Profiwissen aus dem Jahr 2003.

Es ist im Zentralen Verzeichnis Antiquarischer Bücher (www.zwab.com) noch recht günstig zu haben:
https://www.zvab.com/servlet/BookDet...-srp1-_-image2

Das Buch ist zwar "alt", aber die vermittelten Kenntnisse sind zeitlos und funktionieren auch bei neueren Delphi-Versionen.

Viel Erfolg!

Super, vielen Dank für den Hinweis.

Gruß

Teesäufer

stahli 10. Jan 2021 23:11

AW: Destruktor für verkettete Liste
 
Die Variablen beinhalten Pointer, die auf einen reservierten Speicherbereich zeigen, in dem die Objektdaten liegen.

Folgendes Beispiel:
Delphi-Quellcode:
var
  Person1, Person2: TPerson;
...
Person1 := TPerson.Create; // hierdurch wird Speicher reserviert und der Pointer weist auf eine Speicheradresse
Person1.Name := 'Max'; // die Daten werden in dem Speicherbereich abgelegt
Person2 := Person1; // die Variable Person2 erhält den gleichen Pointerwert wie Person1 (zeigt also auf die gleiche Stelle)
Person1.Free; // Der Speicherbereich wird wieder freigegeben, "Max" bleibt aber dort stehen und kann ggf. irgendwann wieder überschrieben werden (bis dahin können aber beide Variablen noch mit "Max" arbeiten - sie zeigen halt nur nicht mehr auf korrekt reservierten Speicher)
Person1 := nil; // jetzt kann auf Person1 nicht mehr zugegriffen werden, da diese nicht mehr auf eine Speicherstelle zeigt sondern NULL beinhaltet
Person2 := nil; // setzt auch diese Variable auf NULL - Zugriffe auf beide Variablen führen jetzt zu einem Laufzeitfehler
Das Freigeben und auf NIL setzen, kann man auch mit einem Rutsch erledigen: FreeAndNil(Person1)

DeddyH 11. Jan 2021 05:51

AW: Destruktor für verkettete Liste
 
Wenn die Liste keine Elementverwaltungsklasse ist, sondern ein Element an sich, muss man sich das erste (oder bei mehrfach verketteten Listen ggf. das letzte) Element irgendwo global merken. Ab dort kann man dann die komplette Liste freigeben, das sollte mit dem eingangs gezeigten Destruktor auch funktionieren (wobei ich statt auf nil zu prüfen und dann Destroy aufzurufen lieber gleich Free verwenden würde, das macht nämlich intern genau das).

hoika 11. Jan 2021 08:00

AW: Destruktor für verkettete Liste
 
Hallo,
Zitat:

Mit dem Destruktor habe ich noch meine Probleme
Ich hatte erst mal ein Problem mit deinem Objekt ;)

TListe würde ich mal TListenEintrag nennen.

Und das Destroy des Listen-Eintrages ist nicht vollständig oder fehlerhaft,
das Next darf ja nicht einfach gelöscht werden (Absicht?).

Die Frage ist immer, wissen die Listeneintrag-Objekte, was sie tun müssen (bei Insert/Delete)
oder gibt es eine übergeordnete Klasse, die die ganze Arbeit macht
und die Listeneintrag-Objekte sind dumme Objekte, die nur die Daten enthalten.

jaenicke 11. Jan 2021 08:29

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1480702)
Zitat:

Zitat von Andreas13 (Beitrag 1480701)
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

die portable Version 5.

Delphi 5? Wie bist du denn da herangekommen als Neueinsteiger? Die ist uralt. Und legal gibt es auch keine portablen Versionen.

Von daher weise ich an der Stelle mal auf die aktuelle kostenlose Community Edition hin...
https://www.embarcadero.com/de/products/delphi/starter

Teesäufer 11. Jan 2021 20:31

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von jaenicke (Beitrag 1480717)
Zitat:

Zitat von Teesäufer (Beitrag 1480702)
Zitat:

Zitat von Andreas13 (Beitrag 1480701)
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

die portable Version 5.

Delphi 5? Wie bist du denn da herangekommen als Neueinsteiger? Die ist uralt. Und legal gibt es auch keine portablen Versionen.

Hallo Jaenicke,

erst mal vielen Dank für die Antworten. Die fand ich im Internet. Ich wollte etwas, was auf einen Stick passt.

Gruß

Teesäufer

Teesäufer 11. Jan 2021 20:34

AW: Destruktor für verkettete Liste
 
Hallo Stahli,

Zitat:

Zitat von stahli (Beitrag 1480703)
Das Freigeben und auf NIL setzen, kann man auch mit einem Rutsch erledigen: FreeAndNil(Person1)

Ja, das hatte ich auch so mitbekommen. Aber beinhaltet das dann auch die anderen Objekte (in dem Fall den Rest der Kette)

Gruß

Teesäufer

stahli 11. Jan 2021 21:18

AW: Destruktor für verkettete Liste
 
Obj.Free oder FreeAndNil(Obj) gibt erst mal nur das Objekt frei (und setzt im letzteren Fall die Variable auf NULL).

Dabei wird das ausgeführt, was Du im Destructor des Objektes festgelegt hast.
Wenn Du dort das jeweils folgende Objekt freigibst usw. (und dabei alle Objekte erwischst), dann werden alle Objekte der Liste freigegeben.

QuickAndDirty 11. Jan 2021 21:55

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1480796)
Zitat:

Zitat von jaenicke (Beitrag 1480717)
Zitat:

Zitat von Teesäufer (Beitrag 1480702)
Zitat:

Zitat von Andreas13 (Beitrag 1480701)
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

die portable Version 5.

Delphi 5? Wie bist du denn da herangekommen als Neueinsteiger? Die ist uralt. Und legal gibt es auch keine portablen Versionen.

Hallo Jaenicke,

erst mal vielen Dank für die Antworten. Die fand ich im Internet. Ich wollte etwas, was auf einen Stick passt.

Gruß

Teesäufer

Lazerus, gibt es glaue ich auch also portable version.
Ist legal und besser supported als Delphi 5 .
Ich weiß nicht wie das mit der Starter Edition von Delphi ist, aber man weiß bei Delphi nicht immer wie lange es eine freie Version gibt oder in welcher Form oder überhaupt sie sich beim nächsten Release manifestiert.
Delphi ist heute eher ein Produkt für den professionellen Bereich das am besten aboniert wird.
Orientiere dich an Lazarus! Oder eben C# mit oder VS-Studio oder Python mit VSCode.

jaenicke 12. Jan 2021 16:42

AW: Destruktor für verkettete Liste
 
Ja, Lazarus ist deutlich besser als Delphi 5. Die aktuelle Delphi Community Edition ist wiederum deutlich besser als Lazarus.

Mavarik 13. Jan 2021 13:14

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1480797)
Hallo Stahli,

Zitat:

Zitat von stahli (Beitrag 1480703)
Das Freigeben und auf NIL setzen, kann man auch mit einem Rutsch erledigen: FreeAndNil(Person1)

Ja, das hatte ich auch so mitbekommen. Aber beinhaltet das dann auch die anderen Objekte (in dem Fall den Rest der Kette)

OK... Nochmal vom Anfang an.

Delphi-Quellcode:
TListe = class
    private
    inhalt: string;
    next: Tliste;
    public
    constructor create(wert: string);
    destructor destroy; override;
    function gibmirinhalt: string;

  end;
Klar kann man Objekte (Class) für eine verkettete Liste nehmen. Wie setzt du next?


Delphi-Quellcode:
Type
  PStringItem = StringItem;
  StringItem = Record
                  Inhalt : String;
                  Next  : PStringItem;
                end;
var
  Root : PStringItem;

Währe eher mein Ansatz für eine verkette Liste. Oder:

Delphi-Quellcode:
Type
  IStringItem = Interface
   ['{CCB4015D-A7A8-44D1-910B-ADC1847C0BC4}']
    Function GetInhalt : String;
    Procedure SetInhalt(Const aValue : String);
    Property Inhalt : String read GetInhalt write SetInhalt;
  end;

  TStringItem = Class(TInterfacedObject,IStringItem)
    private
      Function GetInhalt : String;
      Procedure SetInhalt(Const aValue : String);
    private
      fInhalt : String;
    public
      Constructor Create(Const aInhalt : String);
  end;

var
  StringList : array of IStringItem;

Ein Setlength(StringList,0) löscht alle Deine Elemente...

Mavarik :coder:

Teesäufer 17. Jan 2021 16:24

AW: Destruktor für verkettete Liste
 
Hallo Mavarik,

zuerst einmal möchte ich mich für die späte Antwort entschuldigen. Aber ich habe zu viel anderen Kram, sodass ich mich ums Programmieren meistens nur einmal die Woche kümmern kann.

Zitat:

Zitat von Mavarik (Beitrag 1480920)

Klar kann man Objekte (Class) für eine verkettete Liste nehmen. Wie setzt du next?


procedure TListObjekt.ergaenze(neu: string);
var element: TListelement;
begin
element:=TListelement.Create(neu);
if start=nil then
begin
start:=element;
aktuell:=element;
end
else
begin
endeListe;
aktuell.next:=element;
aktuell:=aktuell.next;
end;
end;

Das mit Lazarus schaue ich mir bei Gelegenheit mal an ...

Mavarik 18. Jan 2021 19:02

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1481095)
Hallo Mavarik,

Delphi-Quellcode:
procedure TListObjekt.ergaenze(neu: string);
var element: TListelement;
begin
  element:=TListelement.Create(neu);
  if start=nil then
  begin
    start:=element;
    aktuell:=element;
  end
  else
  begin
    endeListe;
    aktuell.next:=element;
    aktuell:=aktuell.next;
  end;
end;

Next ist ein privates Feld, Diese Feld kannst Du nur in der gleichen Unit erreichen... Das macht man so nicht!

Mavarik

EmWieMichael 19. Jan 2021 09:00

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Mavarik (Beitrag 1480920)
...
Delphi-Quellcode:
Type
  PStringItem = StringItem;
  StringItem = Record
                  Inhalt : String;
                  Next  : PStringItem;
                end;
var
  Root : PStringItem;

Da fehlt aber eine entscheidende Kleinigkeit :wink:: PStringItem = ^StringItem;

Mavarik 19. Jan 2021 15:30

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von EmWieMichael (Beitrag 1481160)
Zitat:

Zitat von Mavarik (Beitrag 1480920)
...
Delphi-Quellcode:
Type
  PStringItem = ^StringItem;
  StringItem = Record
                  Inhalt : String;
                  Next  : PStringItem;
                end;
var
  Root : PStringItem;

Da fehlt aber eine entscheidende Kleinigkeit :wink:: PStringItem = ^StringItem;

Das ist richtig.. Ich braucht immer 2 Versuche um das "^" in den Source zu bekommen.

Andreas13 19. Jan 2021 15:57

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von Teesäufer (Beitrag 1481095)
procedure TListObjekt.ergaenze(neu: string);
var element: TListelement;
begin
element:=TListelement.Create(neu);
if start=nil then
begin
start:=element;
aktuell:=element;
end
else
begin
endeListe;
aktuell.next:=element;
aktuell:=aktuell.next;
end;
end;

Hallo Teesäufer,
Du kannst Deinen QuellCode hier mit Hilfe des Delphi-Symbols (= Helm mit rotem Kamm gleich über der ersten Zeile im Editor) richtig formatieren, damit er besser lesbar ist.
Gruß, Andreas
PS: Das geht auch nachträglich über den Button "Bearbeiten"

QuickAndDirty 25. Jul 2021 12:47

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von jaenicke (Beitrag 1480865)
Die aktuelle Delphi Community Edition ist wiederum deutlich besser als Lazarus.

Das stimmt, im moment...aber es kann sein dass die morgen weg ist.

jaenicke 26. Jul 2021 05:07

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1492778)
Zitat:

Zitat von jaenicke (Beitrag 1480865)
Die aktuelle Delphi Community Edition ist wiederum deutlich besser als Lazarus.

Das stimmt, im moment...aber es kann sein dass die morgen weg ist.

Nun ja, ich habe gerade für meinen Sohn und mich die neue Community Edition installiert. Diese hat (eventuell durch einen Fehler, wurde also vielleicht auch wieder geändert) eine unbegrenzte Laufzeit.

generic 26. Jul 2021 13:01

AW: Destruktor für verkettete Liste
 
@Tee gibt es ein Grund, warum du die Liste selbst baust?
Delphi hat fertige Listen für alle Möglichen Einsatzgebiete.

QuickAndDirty 31. Jul 2021 20:52

AW: Destruktor für verkettete Liste
 
Zitat:

Zitat von jaenicke (Beitrag 1492802)
Zitat:

Zitat von QuickAndDirty (Beitrag 1492778)
Zitat:

Zitat von jaenicke (Beitrag 1480865)
Die aktuelle Delphi Community Edition ist wiederum deutlich besser als Lazarus.

Das stimmt, im moment...aber es kann sein dass die morgen weg ist.

Nun ja, ich habe gerade für meinen Sohn und mich die neue Community Edition installiert. Diese hat (eventuell durch einen Fehler, wurde also vielleicht auch wieder geändert) eine unbegrenzte Laufzeit.

Sorry. Ich meinte das es zu aktuelleren Delphi Versionen keine Community editions geben wird.
Für ich ist eine IDE die keine updates bekommt nichts was ich benutzen würde.


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