![]() |
Baum: Pfad ausgeben
Hallo Forum!
Ich bin neu hier und habe auch gleich ein Problem... Ich habe wie folgt einen Baum deklariert:
Delphi-Quellcode:
Desweiteren habe ich einen Typ TNodesArray deklariert:
TYPE TPtr = ^TNode;
TNode = RECORD i: integer; c: string[2]; left, right: TPtr; END;
Delphi-Quellcode:
Dann baue ich aus einem solchen Array einen Baum:
TNodesArray = ARRAY OF TNode;
Delphi-Quellcode:
... um dann den Pfad zu einem Zeichen als Folge von 0en und 1en ausgeben zu können:
PROCEDURE HuffTreeBauen(var BlaArray: TNodesArray; var root: TNode);
VAR node, node2: TPtr; hs: string[2]; i: integer; BEGIN Sort(BlaArray); WHILE length(BlaArray) > 1 DO BEGIN new(node); node^ := BlaArray[0]; new(node2); node2^ := BlaArray[1]; BlaArray[0].i := BlaArray[0].i + BlaArray[1].i; BlaArray[0].left := node; BlaArray[1].right := node2; Test(BlaArray[0], 1); FOR i := 1 TO length(BlaArray) - 2 DO BlaArray[i] := BlaArray[i + 1]; SetLength(BlaArray, (length(BlaArray) - 1)); Sort(BlaArray); END; root := BlaArray[0]; END;
Delphi-Quellcode:
Und hier kommt mein Problem:
FUNCTION Pfad(root: TPtr; x: char): string;
BEGIN found := FALSE; IF root^.c[1] <> x THEN BEGIN IF ((root^.left <> NIL)) THEN BEGIN result := '0' + Pfad(root^.left, x); IF ((NOT found){ AND (root^.right <> NIL)}) THEN result := '1' + Pfad(root^.right, x); END; END ELSE BEGIN result := ''; found := TRUE; END; END; Wenn ich den auskommentierten Teil in der letzten Funktion weglasse, krieg ich ne Access Violation, wenn der Teil als Bedingung dabeibleibt, wird die Anweisung nie ausgeführt... Ich bekomme immer nur '00' oder '000' oder dergleichen raus... Hoffentlich kann mir hier jemand helfen! Liebe Grüße, Peter |
Re: Baum: Pfad ausgeben
Was ist den in deiner letzten Funktion "X" ?
|
Re: Baum: Pfad ausgeben
Oh, sorry ich editiere mal den ertsen Beitrag...
So.. Hab ihn editiert: x ist ein das Zeichen, nach dem gesucht werden soll! |
Re: Baum: Pfad ausgeben
Wo ist found deklariert?
Wenn du AND (root^.right <> NIL) wegläßt, dann kann es vorkommen, daß root^.right auch mal NIL ist. Und wenn dieses NIL ist, dann will das nächste (nach dem neuen Aufruf von Pfad) root^ einen NIL-Pointer dereferenzieren, was natürlich nicht geht. Sicher daß root^.right innerhalb der root^.left-Befingung ausgewertet werden muß? |
Re: Baum: Pfad ausgeben
Argh!
found ist lokale Variable in "Pfad". Naja, so wie der Baum aufgebaut wird, ist an allen Knoten, die links auf NIL zeigen auch rechts Ende, also zeigen beide auf NIL. Ich bin mir inzwischen garnicht mehr sicher, ob da überhaupt etwas richtig ist... |
Re: Baum: Pfad ausgeben
Zitat:
(wobei viele ja gerne globale Variablen verwenden :wall: ) Es ist aber auch immer schön, wenn wichtige Dinge einfach weggelassen werden, so wie z.B. irgendwelche Dekarationen. :zwinker: So ala:
Delphi-Quellcode:
FUNCTION Pfad(root: TPtr; x: char): string;
VAR fount: Boolean; BEGIN ... Zitat:
und schau ob/wo dieses "found" überhaupt mal TRUE werden kann. Wenn nicht, dann ist es immer FALSE und somit würde dieser IF-Zweig immer ausgeführt, selbst wenn er es womöglich nicht sollte. [add] Eventuell meinst du es so?
Delphi-Quellcode:
FUNCTION Pfad(root: TPtr; x: char): string;
BEGIN IF root^.c[1] <> x THEN BEGIN IF Assigned(root^.left) THEN result := '0' + Pfad(root^.left, x) ELSE IF Assigned(root^.right) THEN result := '1' + Pfad(root^.right, x) ELSE result := ''; END ELSE result := ''; END; |
Re: Baum: Pfad ausgeben
Ja, kann es, wenn
Delphi-Quellcode:
erfüllt ist...
root^.c[1] <> x
Ich verstehe jetzt nicht, wie du das meinst?! Ich glaube nicht, dass dein Edit den Zweck erfüllt, da ich denke, dass die Suche in den Teilbäumen rechts/links ja "auf der selben Ebene" erfolgen müsste... Das funktioniert so denke ich mal nicht, da ja eigentlich dort, wo root^.left = NIL ist, auch root^.right = NIL ist, oder zumindest sein sollte... |
Re: Baum: Pfad ausgeben
Delphi-Quellcode:
FUNCTION Pfad(root: TPtr; x: char): string;
var found: Boolean; BEGIN found := FALSE; IF root^.c[1] <> x THEN BEGIN IF ((root^.left <> NIL)) THEN BEGIN result := '0' + Pfad(root^.left, x); IF ((NOT found){ AND (root^.right <> NIL)}) THEN result := '1' + Pfad(root^.right, x); // vor diesem IF ist found immer false, da es nirgendwo "vorher" auf TRUE gesetzt wird. END; END ELSE BEGIN result := ''; found := TRUE; // hier ist die einzige Stelle, wo found auf True umgestellt wird // aber hiernach wird die Funktion verlassen und es ist demnach eh egal END; END; |
Re: Baum: Pfad ausgeben
Wieso wird die Funktion dort verlassen?
Ich könnte doch auch THEN und ELSE vertauschen, wenn ich die Bedingung ändere:
Delphi-Quellcode:
FUNCTION Pfad(root: TPtr; x: char): string;
VAR found: boolean; BEGIN found := FALSE; IF root^.c[1] = x THEN BEGIN result := ''; found := TRUE; END ELSE BEGIN IF ((root^.left <> NIL)) THEN BEGIN result := '0' + Pfad(root^.left, x); IF (NOT found AND (root^.right <> NIL)) THEN result := '1' + Pfad(root^.right, x); END; END; END; |
Re: Baum: Pfad ausgeben
Na weil nach dem ELSE-Block die Funktion zu Ende ist?
Und selbst wenn du es vertauschst, bleibt es dabei, da ENTWEDER der IF-Block ODER der ELSE-Block ausgeführt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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 by Thomas Breitkreuz