![]() |
Delphi-Version: 5
Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,
ich soll einen binären Baum mithilfe einer Klasse erstellen. Jedoch sind meine Methoden (vor allem (bzw glaube nur) beim löschen) verbuggt. Wenn ich schnell irgendwas eingebe, dies dann lösche kommt manchmal eine Fehlermeldung (z.B. Ungültige Zeigeroperation), jedoch kann ich dies nicht hilfreich nachstellen, sodass ich sehe an welcher Stelle genau was falsch ist (wenn ich es langsam und überlegt löscht, kommt kein Fehler). Oo Kann mir bitte jemand helfen oder einen Tipp geben? :) Vielen Dank LG ford42 |
AW: Binärer Baum mit Klasse
Zitat:
Ein weiterer Design-Fehler ist das Ansprechen des aktuellen Formulars innerhalb Deiner Klasse, z.B. hier:
Code:
Die Ausgabe der Daten über das Formular hat in der Klasse nichts zu suchen. Eventuell könnte man an die Klasse ein Element des Formulars als Parameter übergeben; so wie Du es gemacht hast, ist es leider sehr unübersichtlich, fehleranfällig und nicht leicht auf andere Probleme (oder Formulare) anpassbar.
constructor TNodeTest.Create;
begin inherited; //hierdurch wird der ursprüngliche Konstruktor aufgerufen Form4.RE_Status.SelAttributes.Color := clGreen; Form4.RE_Status.Lines.Add('$' + IntToStr(Integer(self)) + ' wurde erstellt'); Form4.RE_Status.SelAttributes.Color := clBlack; Inc(Form4.NodeI); end; Überlege Dir einfach einmal, was Du alles ändern müsstest, wenn der Baum auf einem anderen Formular laufen soll... ub60 |
AW: Binärer Baum mit Klasse
Ja, da hast du Recht.
Das ist (vor allem) so unübersichtlich geworden, da ich es davor mit records und Pointer gemacht habe und es dann zu ner Klasse umwandeln sollte.... Aber dann bau ich es mal um (da deine Argumente, vor allem dein letztes (anderes Formular) natürlich Sinn ergeben! :) |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Ich scheiter gerade an den Klassenmethoden.
Also ich muss ja z.B. class procedure Einfuegen(eingabe: String) als Klassenmethode defenieren (da es ja nur einmal vorkommen darf) oder? Und wie kann ich die dann in der Unit für die Gui aufrufen? :o Dankeschön LG ford42 |
AW: Binärer Baum mit Klasse
Zitat:
Klassenmethoden operieren auf der Klasse und haben daher nur Zugriff auf allgemeine Dinge und andere Klassenmethoden und Klassenvariablen. Aber nicht auf normale Felder einer Objektinstanz, auf denen normale Methoden operieren. Eine Methode wie "Einfügen" ist mit ziemlicher Sicherheit keine Klassenmethode, sondern eine normale, da du dir sonst die Möglichkeit versperrst, mehrere Objekte (Instanzen) dieser Klasse zu haben, die unterschiedliche Werte eingefügt bekommen können. Deine aktuelle Deklaration von TNodeTest scheint mir also ziemlich falsch. Mach mal überall das "class" Präfix weg. Übrigens:
Delphi-Quellcode:
// statt:
class var NodeI: Integer; class var wAendern: Integer; class var PWurzelNode: TNodeTest; class var PStandNode: TNodeTest; class var PParentNode: TNodeTest; // geht auch einfach: class var NodeI: Integer; wAendern: Integer; PWurzelNode: TNodeTest; PStandNode: TNodeTest; PParentNode: TNodeTest; // und statt if PWurzelNode <> nil then // kann man auch schreiben if Assigned(PWurzelNode) then // ist absolut gleichwertig, Assigned() testet auf <> nil, nur damit du es mal gesehen hast |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, das war mir so nicht klar. Ich habe es davor anders verstanden. :angel2:
Der Tipp mit Assigned ist auch sehr hilfreich, da es Tipparbeit erspart. :D Würdet ihr jetzt noch was ändern, oder passt es soweit? :) |
AW: Binärer Baum mit Klasse
Zitat:
Hast Du noch Form4 in der Klasse. Char 'r' und 'l' ??? Warum Class var... Sollte man - bis auf wenige stellen - drauf verzichten. " if Form4.Loeschen('alles') then " Sorry aber den Code kann man kaum lesen! |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal dankeschön. :)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Kann mir da bitte jemand weiterhelfen/einen Tipp geben? :) Zitat:
Dankeschön :) EDIT: Die LoescheUndFuegeEin-Methode war bei der vorherigen verbuggt |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Um sowas wie "Rechts" und "Links" zu speichern nimm einen eigenen Typen...
Delphi-Quellcode:
Es ist im Zip Nie die Datei BaumklasseUnit.dfm dabei... Daher kann man es nicht testen - jedenfalls nicht so einfach
Type
TLaufrichtung = (lrKeine,lrRechts,lrLinks); |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Ok dankeschön.
Habs nun mit dem Typen gemacht. :) Und nun ists auch mit der BaumklasseUnit.dfm verpackt. :D LG ford42 |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Den Bug kann ich aber trotzdem nicht fixen, weil ich nicht rausbekomme wie er entsteht.
Wenn ich wild auf der Tastatur irgendwelche Werte eingebe, rechts links, verschiedene Lösch-Funktionen ausführe und dann wieder wohin navigiere kommt z. B. der Fehler, den ich unten angehängt habe. Aber wie bekomm ich jetzt raus wodurch er entsteht? :o Vielen Dank LG ford42 EDIT: Nun auch gescheit formatiert (aber die Klammern find ich so eig schöner, deshalb hab ich sie so gelassen) Und eig müsste es jetzt alles bugfrei laufen! :) |
AW: Binärer Baum mit Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Argh, ich hab einen Denkfehler in einer Methode (entweder TNodeTest.LoescheUndFuegeEin oder/und TNodeTest.EinzelnerKnotenLoeschen).
Ich habe nun beide Methoden nochmal neu geschrieben (Algo aufgestellt und umgesetzt) und es geht immer noch nicht richtig. Was nicht geht: Es sieht so aus, dass manchmal nicht nur ein Knoten sondern alle gelöscht weden bzw manche einfach abgehangen werden. Also z.b. PStandNode.FLinks := nil; gemacht wird. Denn der Destruktor wird nicht immer angeschmissen, aber ich kann dann nicht mehr zu allen nodes navigieren und sichtbar sind sie auch nicht mehr (im TreeView). Sry, ich weiß, dass ich nicht gut erklären kann. Deshalb hänge ich mein Projekt wieder an. Gebt ein paar zufällige Zahlen ein, löscht ein paar Mal einzelne Knoten, die ein oder zwei Kinder haben und mit etwas Glück seht ihr, was ich meine. :) Vielen Dank LG ford42 :) EDIT: Hab bisher 2 Fehler gefunden: 1.:
Code:
anstatt
if Assigned(PWurzelBufferNode.FLinks) and Assigned(PWurzelBufferNode.FRechts) then
Code:
if Assigned(PWurzelBufferNode.FLinks) and Assigned(PWurzelNode.FRechts) then
2.:
Code:
anstatt
until (BufferStack.Count = 0) and ((PBufferNode.FRechts = nil) and (PBufferNode.FLinks = nil));
Code:
until (BufferStack.Count = 0) or ((PBufferNode.FRechts = nil) or (PBufferNode.FLinks = nil));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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