großer Logikfehler oder kleines Zeigerproblem?



  • Ich habe hier in meinem Programm einen oder mehrere Fehler, die beim Programmstart zu Fehlermeldungen folgender Art führen:

    Anweisung in "..." verweist auf Speicher in "...". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.

    Dazu erstmal etwas Code:

    Das hier ist mein Konstrukt, worauf alles beruht. Es enthält einen String um ein Wort abzuspeichern, und 2 Zeiger auf den linken, bzw. rechten Nachfolger. (das Ganze ist wie ein Baum aufgebaut):

    struct AVLvertex {
    	string vertex;
    	AVLvertex* leftAVL;
    	AVLvertex* rightAVL;
    };
    

    Um die Sache einfach zu halten, hier erstmal nur eine der Funktionen. Ich denke, das Hauptproblem steckt hier drin:

    void AVLstring::AVLrotateLeft(AVLvertex *Vertex) {
    	AVLvertex* temp;
    	temp = Vertex->leftAVL;							//Bild 1
    	Vertex->leftAVL = new AVLvertex;					//Bild 2
    	Vertex->leftAVL->leftAVL = temp;
    	Vertex->leftAVL->rightAVL = Vertex->rightAVL->leftAVL;
    	Vertex->leftAVL->vertex = Vertex->vertex;				//Bild 3
    
    	temp = Vertex->rightAVL->rightAVL;
    	Vertex->vertex = Vertex->rightAVL->vertex;
    	delete Vertex->rightAVL;
    	Vertex->rightAVL = temp;						//Bild 4
    };
    

    Ist evtl etwas kompliziert, aber ich hoffe jemand blickt da durch. Um es ein wenig einfach zu machen, hier eine Skizze dazu: Skizze
    welches Bild die Situation nach welchem Schritt darstellt, hab ich oben im Code beigeschrieben.

    Wie gesagt kommt immer die oben genannte Fehlermeldung, und ich weiß nicht, ob sich in dem Code ein Logikfehler versteckt, oder ob ich irgendwelche Zeigeranweisungen falsch verwende. Kann auf Nachfrage auch gerne noch weiteren Code liefern.
    Würde mich freuen wenn mir jemand weiterhelfen kann 🙂



  • Bist du dir sicher, daß der Baum so aussieht wie in deinen Bildern dargestellt? Möglicherweise ist ja Vertex->rightAVL gleich NULL, dann bekommst du Probleme bei allen Anweisungen, die sich auf dessen Elemente beziehen.



  • eigentlich bin ich mir sicher, dass Vertex->rightVertex existiert, da sonst die Funktion nicht aufgerufen werden sollte.
    Hab aber auch schonmal alle Anweisungen die sich auf diese Elemente beziehen in ein if(Vertex->rightVertex != NULL) gesetzt, und es traten die selben Fehler auf. Also wirds daran nicht liegen.


Anmelden zum Antworten