verkette Liste: Zeiger auf Startelement kann nicht ausgewertet werden



  • *andenKopfschlag*
    Das mit dem Speicherleck stimmt; das habe ich erst mal in allen Funktionen behoben:

    int ObjList::getListLenght()
    {
        Obj *pTemp = pStart;
        [...]
    }
    

    Noch etwas: an der Stelle, wo ich *pTemp den Zeiger auf pStart zuweise, meldet mir Windows bzw. der Debugger eine Zugriffsverletzung:

    Unbehandelte Ausnahme: 0xC0000005: Access Violation.

    Der Next-Pointer des letzten Elementes muss doch auf NULL zeigen, weil kein ja weiteres Element mehr kommt. Ich hatte mir gedacht, dass der Fehler zustande kommt, weil der pNext-Zeiger von pStart am Anfang nicht auf NULL stand und habe den Konstruktor umgeschrieben:

    ObjList::ObjList()
    {
        pStart = NULL;
        pStart->pNext = NULL;
    }
    

    Hierbei ist das Programm allerdings sofort abgestürzt, als dieser Konstruktor aufgerufen wurde 🙄

    Vielleicht hilft die 'Element hinzufügen'-Funktion etwas:

    void ObjList::addItem(int x, int y)
    {
        Obj *pObj = new Obj;
        pObj->m_x = x;
        pObj->m_y = y;
    
        pObj->pNext = pStart;
        pStart = pObj;
    }
    

    [ Dieser Beitrag wurde am 07.06.2003 um 13:44 Uhr von jmd editiert. ]



  • ObjList::ObjList()
    {
        pStart = NULL;
        pStart->pNext = NULL;
    }
    

    dass das abstürzt is ja klar, weil du auf nen 0-zeiger zugreifst!



  • Na gut, das hab ich mir dann auch gedacht; aber umgekehrt funktioniert es auch nicht, weil ja pStart angfangs noch nicht initialisiert ist 😃 :

    ObjList::ObjList()
    {
        pStart->pNext = NULL;
        pStart = NULL;
    }
    

    Aber das hat jetzt nichts mit meinem Problem zu tun 🕶



  • Hi!

    void ObjList::addItem(int x, int y)
    {
        Obj *pObj = new Obj;
        pObj->m_x = x;
        pObj->m_y = y;
        pObj->pNext = pStart;
        pStart = pObj;
    }
    

    Überleg mal was du hier machst:
    Du erstellst ein neues Objekt, setzt den next Zeiger auf den Anfang deiner Kette(pStart) und dann weist du pStart deinem neu erstellten Objekt zu. pStart->pNext() ist also == pStart selbst.
    Wenn du dir jetzt diesen Code hier anguckst, sollte es dir auffallen 🙂

    pTemp = pStart;
        int i=0;
        while(pTemp != NULL)
        {
            pTemp = pTemp->pNext;
            i++;
        }
    

    Endlosschleife!

    [ Dieser Beitrag wurde am 07.06.2003 um 15:02 Uhr von KPC editiert. ]



  • Ich wollte editieren nicht zitieren...

    [ Dieser Beitrag wurde am 07.06.2003 um 15:01 Uhr von KPC editiert. ]



  • Da ist nichts zyklisch. Spielen wir das mal mit konkreten Werten durch:

    pStart ist anfangs 0
    pObj sei 200
    jetzt wird pObj->pNext auf pStart, also 0 gesetzt
    jetzt wird pStart auf pObj, also 200 gesetzt.

    die Liste besteht jetzt aus einem Knoten bei 200, dessen Next-Zeiger auf 0 zeigt.

    Ich seh ansonsten keinen Fehler. Ich hätt irgendwie in der addItem was vermutet, aber die ist ok.

    (BTW hab ich in meinem ersten Posting ein "nicht" vergessen *schäm*)



  • Tja, bin jetzt auch ein wenig ratlos, weil es von der Theorie her doch eigentlich funktionieren sollte (habe diese Klasse mit diesen Funktionen auch schon etliche Male fehlerfrei benutzt).

    Wo ihr so fleißig auf Fehlersuche seid: folgende Funktion ist auch Bestandteil der List-Klasse und dient dazu, die Objekte zu bewegen, und - wenn außerhalb des sichtbaren Bereiches - zu löschen:

    void ObjList::MoveObjects()
    {
        if(getListLenght() > 0)
        {
            Obj *pTemp = pStart;
    
            for(int i=0; i<getListLenght(); i++)
            {
                pTemp->m_y -= ObjVelocity;
                if(pTemp->m_y <= 0)
                    delItem(i);
                pTemp = pTemp->pNext;
            }
        }
    };
    

    ObjVelocity sei hier eine beliebige (initialisierte) Variable vom Typ int. Ursprünglich ist das Programm hier ebenfalls abgestürzt... immer, wenn ich pTemp den Wert von pStart zuweisen will... 😕



  • Anmerkung zum letzten Post: in dieser Funktion ist das Programm früher abgestürzt, weil ich die getListLenght()-Funktion damals noch nicht vorher aufgerufen hatte. Hat also wenig direkt mit dieser Funktion zu tun, als das irgendwas beim Zuweisen schiefgeht...



  • Poste doch mal die ganze Klasse oder stell sie auf einen Webspace mit einer Exampledatei, wo das ganze abschmiert. Dann kann man es ja mal debuggen.



  • Original erstellt von KPC:
    Poste doch mal die ganze Klasse oder stell sie auf einen Webspace mit einer Exampledatei, wo das ganze abschmiert. Dann kann man es ja mal debuggen.

    Okay: als ich die ganze verkettete Liste in ein kleines Simulationsprogramm exportiert habe, hat sie reibungslos funktioniert. Das Problem muss also irgendwie grundlegend im Programm liegen.

    Das ganze stellt meine ersten Gehversuche im Bereich der 2D-Graphik mit DirectX dar. Ich wollte mich in einem 2D-Space-Shooter probieren, allerdings scheint es da einige Probleme zu geben. Quellcode (weiß nicht, ob sich da ein Außenstehender ohne weiteres reinfitzen kann...), nötige Ressourcen und die compilierte .exe:

    [edit: vom Webspace genommen]

    Wer so mutig ist, mir zu vertrauen 😃 - Nein: habe da keinen Virus programmiert (wäre froh, wenn ich es könnte 😉 ).
    Allerdings wird das DirectX 8.1 SDK zum compilieren benötigt...
    Mir ist durchaus bewusst, dass es an dem Quellcode noch mehr als tausend Sachen zu bemängeln gilt. Wer das hier posten will, kann das auch gerne tun (weiß gar nicht, ob das dann noch das richtige Forum dafür ist...) oder per E-Mail schreiben.

    Allerdings besteht das Hauptproblem in der ersten Zeile der Funktion ShotList::getListLenght() 😞

    [edit]: habe es hinbekommen, aber wo der Fehler nun direkt lag, weiß ich auch nicht mehr 😞

    [ Dieser Beitrag wurde am 09.06.2003 um 13:13 Uhr von jmd editiert. ]


Anmelden zum Antworten