AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Baum: Pfad ausgeben

Offene Frage von "P_P"
Ein Thema von P_P · begonnen am 5. Apr 2010 · letzter Beitrag vom 5. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2   
P_P

Registriert seit: 5. Apr 2010
7 Beiträge
 
#1

Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:14
Hallo Forum!
Ich bin neu hier und habe auch gleich ein Problem...
Ich habe wie folgt einen Baum deklariert:
Delphi-Quellcode:
TYPE TPtr = ^TNode;

TNode = RECORD

      i: integer;

      c: string[2];

      left, right: TPtr;

END;
Desweiteren habe ich einen Typ TNodesArray deklariert:
TNodesArray = ARRAY OF TNode; Dann baue ich aus einem solchen Array einen Baum:

Delphi-Quellcode:
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;
... um dann den Pfad zu einem Zeichen als Folge von 0en und 1en ausgeben zu können:
Delphi-Quellcode:
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;
Und hier kommt mein Problem:
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
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:17
Was ist den in deiner letzten Funktion "X" ?
Lars
  Mit Zitat antworten Zitat
P_P

Registriert seit: 5. Apr 2010
7 Beiträge
 
#3

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:19
Oh, sorry ich editiere mal den ertsen Beitrag...

So..
Hab ihn editiert:
x ist ein das Zeichen, nach dem gesucht werden soll!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#4

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:27
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ß?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
P_P

Registriert seit: 5. Apr 2010
7 Beiträge
 
#5

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:30
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#6

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:36
Zitat von P_P:
Argh!
found ist lokale Variable in "Pfad".
Das ab ich gehofft.
(wobei viele ja gerne globale Variablen verwenden )

Es ist aber auch immer schön, wenn wichtige Dinge einfach weggelassen werden, so wie z.B. irgendwelche Dekarationen.

So ala:
Delphi-Quellcode:
FUNCTION Pfad(root: TPtr; x: char): string;

VAR fount: Boolean;

BEGIN
  ...
Zitat:
IF ((NOT found){
Gut, dann geh mal von diesem IF nach oben
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
P_P

Registriert seit: 5. Apr 2010
7 Beiträge
 
#7

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:44
Ja, kann es, wenn root^.c[1] <> x erfüllt ist...
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#8

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:49
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
P_P

Registriert seit: 5. Apr 2010
7 Beiträge
 
#9

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 18:54
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#10

Re: Baum: Pfad ausgeben

  Alt 5. Apr 2010, 19:05
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:38 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