DVL zahlenwerte in Binärbaum übergeben



  • @C91
    Head ist zu dem Zeitpunkt nullptr, daher darfst du nicht per -> auf irgendwelche Member von head zugreifen.



  • @C91: Du benötigst dafür eine Membervariable (sofern du eine Klasse benutzen willst/sollst) oder aber eine (wenn auch nicht empfohlen) globale Variable head, da sie ja der Kopf für alle einzufügenden Elemente ist.
    Und für die Funktion insertElement solltest du noch einen Parameter übergeben, an der das neue Element eingefügt werden soll (oder soll es immer am Anfang oder Ende der Liste)?

    PS: Warum hast du hier im Subforum C++/CLI mit .NET gepostet?



  • @Th69 darf ich dich bitten, das du mir das mal in meinem Beispiel zeigst?
    Ich blicke da gerade nicht ganz durch.

    PS: Das hier ist ja der C++ bereich, oder nicht?



  • Schau dir mal (besonders die Bilder in) Doppelt verkettete Listen in C an.

    Jetzt erst sehe ich, daß du ja in insertElement() mehrere Elemente (in der Schleife) hinzufügen willst - besser ist es das ersteinmal auf das Einfügen von einem Element (so wie die Funktion ja auch heißt) zu beschränken.
    Und eine weitere Funktion ruft dann diese Funktion in einer Schleife passend auf (mit entsprechenden Parametern).

    PS: Gestern war dieses Thema noch im falschen Subforum, aber das hat wohl ein Moderator inzwischen korrekt verschoben.



  • Also die Liste funktioniert schon mal.

    Nun habe ich beim ausgeben des Baumes ein Problem:

    Ausgelöste Ausnahme: Lesezugriffsverletzung
    "head" war "0xCDCDCDCD".
    

    Der Fehler entsteht in folgender Zeile:

    void display(node* head){   
      		
                if (head != z){
    		display(head->l); // Hier markiert er den Fehler.
    		cout << "Wert: " << head->key << "Wert: " << head->info << endl;
    		display(head->r);
    		}
    }


  • Vermutlich das gleiche Problem wie gestern: head ist nicht initialisiert. Du solltest dir angewöhnen, Zeiger auf Gültigkeit zu überprüfen, bevor du sie benutzt.
    Falls es einen Anwendungsfall gibt, in dem ein Zeiger nullptr sein darf:

    void f( SomeType* some_pointer )
    {
       if( some_pointer )
       {
          some_pointer->something();
       }
    }
    

    falls nicht:

    void f( SomeType* some_pointer )
    {
        std::assert( some_pointer, "some_pointer in f() must not be null" );
        some_pointer->something();
    }
    


  • Head und z habe ich ganz oben:

    node* z, *head;


  • @C91
    Und welchen Wert haben sie?



  • Ändert nichts am Fehler.



  • @C91
    Wer seine Zeiger nicht initialisiert darf sich auch nicht wundern, dass sie einem um die Ohren fliegen. Der MSVC Compiler ist sogar noch so nett und initialisiert sie mit 0xCDCDCDCD, damit man sieht, dass man selbst die Initialisierung vergessen hat.



  • Ich habe beide initialisiert:

    node* head = NULL;
    node* z = NULL;
    

    ??



  • Und wie sieht dein Quelltext jetzt aus?



  • head und z ist global:

    node* head = NULL;
    node* z = NULL;
    

    In der Main habe rufe ich die Funktion auf und übergebe head:

    displayTree(head);
    

    Hier nochmal die Funktion:

    void display(node* head){   
    	
            if (head != z){
    	display(head->l); // Fehler ist noch immer hier.
    	cout << "Wert: " << head->key << "Wert: " << head->info << endl;
    	display(head->r);
            }
    }


  • Welchen Wert haben head und z an der Stelle?
    Btw:
    Der Ausschnitt, den du zeigst, hilft nicht weiter. Erst schreibst du, dass du displayTree aufrufst und sagst dann, dass der Fehler in display auftritt. Wie ist da der Zusammenhang?



  • @DocShoe Ich habe es geändert, dait es lesbarer ist. Ist aber noch immer die gleiche Funktion.



  • @C91
    Du musst dir auch helfen lassen. Ich habe dir zwei konkrete Fragen gestellt, von denen du keine beantwortet hast. Stattdessen Quelltextauszüge, die doch irgendwie doch nicht das sind, was du tatsächlich versuchst.



  • Ich kann den gesamten Code hier nicht posten. Das ist ja das Problem.



  • Was head bedeuten soll, ist klar. Aber wofür steht z?
    Jedenfalls wirst du zwischen der Initialisierung (beide auf 0) und dem display irgendwo eine der beiden Variablen geändert haben (vermutlich z), da dein if (head != z) offenbar wahr ist. Wenn head noch nullptr ist, darfst du nicht auf head->irgendwas zugreifen.

    Wenn dein Code übrigens wirklich C++ sein soll, dann solltest du nullptr statt NULL verwenden und deine DVL in einer Klasse implementieren. Und vermeide die globalen Variablen, die machen alles nur kompliziert.

    Versuche, erstmal nur Code für eine DVL zu schreiben. Und dann zu testen!

    PS: in C++ nimmst du einfach std::list, das ist schon eine fertige DVL (allerdings möchte die Aufgabe vermutlich, dass du das selbst machst).



  • O.K., danke.



  • @wob ich könnte dir den code per PN zusenden. Das würde noch gehen.


Anmelden zum Antworten