Anfängerfehler



  • pumuckl schrieb:

    Das ding heißt dort Callstack oder so ähnlich - auf deutsch weiß ichs ehrlich gesagt nicht

    "Stapelrahmen" :xmas2:



  • Hier mal ein Screeni irgendwas mach ich doch falsch :?

    http://img163.imageshack.us/img163/7438/aufproblem.th.png

    Kann man in diesem Forum eigentlich Bilder posten?

    MfG
    Scarabol



  • Rechts unten. "Aufrufliste".



  • ok, hab ich gesehen aber wie kann ich in den zugehörigen Quellcode springen um den Breakpoint zu setzen? Wenn ich die Zeile anklicke kommt er mir nur mit Dissassembly oder sowas...

    MfG
    Scarabol



  • ?
    Also wenn ich bei mir VS08 Prof. da Doppelklick mache, dann springt er mir in den Code..



  • "Für die aktuelle Position ist kein Quellcode verfügbar!"

    Stimmt so gesehen auch, weil sich das im vorkompilierten Lib der Grafikengine abspielen sollte...

    MfG
    Scarabol



  • ^^
    Na klar. Wenn kein Code vorhanden ist, kann er auch nicht reinspringen. 😉
    Wäre ja zu schön, wenn VS da einfach mal eben aus Binarys C++ Code machen könnte. :p



  • Und was mach ich jetzt :?

    MfG
    Scarabol



  • Naja. Das was man da halt tut. Schrittweise debuggen und schauen, wo der Fehler passiert.
    Mach dir vor allem mal Gedanken über die Dinge, welche ich auf Seite 1 gepostet habe!



  • Der Fehler wird ziemlich sicher nicht in der Grafik-engine passieren, sondern weiter oben. Nehmen wir mal an dein Programm ist so aufgebaut:

    void meineFunktion1()
    {
       bla();
       foo();
       meineFunktion2();
    }
    
    void meineFunktion2()
    {
       grafikFunktionX();
    }
    
    int main()
    {
      int i = 5;
      meineFunktion1();
    }
    

    der callstack lautet dann innerhalb der Grafikfunktion etwa wie folgt:

    - grafikFunktionX
    - meineFunktion2
    - meineFunktion1
    - main
    

    du machst dann natürlcih keinen Doppelklick auf die grafikFunktion sondern auf eine von deinen Funktionen, weil ja anzunehmen ist dass der Fehler bei dir liegt, nicht bei der Bibliothek.
    Und es ist mit ziemlicher Sicherheit irgendwo eine von deinen Funktionen im Callstack. Dort solltest du ansetzen.

    Es dürfte übrigens das eine oder andere Tutorial im Netz geben, wie man mit dem MSVC debuggt, und welche Werkzeuge man beim Debuggen generell benutzen kann/sollte.



  • Der Callstack lautet:

    >	starfighter_online.exe!irr::core::irrAllocator<char>::deallocate(char * ptr=0x0041b620)  Zeile 41 + 0xc Bytes	C++
     	starfighter_online.exe!irr::core::string<char,irr::core::irrAllocator<char> >::~string<char,irr::core::irrAllocator<char> >()  Zeile 191	C++
     	starfighter_online.exe!irr::scene::quake3::`dynamic atexit destructor for 'irrEmptyStringc''()  + 0xd Bytes	C++
     	msvcr90d.dll!1023bd05() 	
     	[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für msvcr90d.dll]	
     	msvcr90d.dll!1023b9e2() 	
     	starfighter_online.exe!__tmainCRTStartup()  Zeile 599	C
     	starfighter_online.exe!mainCRTStartup()  Zeile 403	C
     	kernel32.dll!7c816fe7()
    

    Wie soll ich meine Funktion auswählen?

    Die Grafikengine gibt einen String den es nicht mehr gibt nocheinmal frei. Soweit denke ich kann ich das schonmal festhalten. Der Fehler liegt wahrscheinlich bei mir, da ich irgendwo den Pointer änder oder den String bereits freigebe.
    Wenn ich kurz vor dem Fehler in mein main() gucke bin ich gerade bei dem return das die main() dann auch beendet. Nachdem alles freigegeben ist.

    MfG
    Scarabol



  • Dann bist du in einem der unglücklichen Fälle wo zur Laufzeit alles wunderbar läuft und erst beim Beenden des Programms gibts Salat weil du irgendwo was böses angestellt hast. Wenns bei der Freigabe von strings knallt versuch mal stückweise einzelne Programmteile auszuschließen um die Fehlerursache etwas einzugrenzen, und dann im fehlerhaften programmteil die Behandlung deiner Strings rauskommentieren - vermutlich stößt du schon auf dem Weg dahin irgendwo über den Fehler. Das wichtigste ist: immer hinterfragen was du gemacht hast, ob die Annahmen die du in einem Stück Code hast auch wirklich zutreffen.



  • Na endlich nachdem ich nun die komplette main.cpp auskommentiert habe, hab ich nun auch angefangen die Dateien die mit dem Projekt verknüpft waren aus dem Projekt zu entfernen. Und siehe da es läuft durch ohne Fehler...

    Welche Dateien muss ich dem Projekt als Headerdateien/Quelldateien hinzufügen?
    Reicht es nicht wenn ich die Dateien bzw. ihre Header in der main.cpp mittels #include einfüge?

    MfG
    Scarabol



  • Grundsätzlich reicht es, wenn einfach der Fehlerhafte Code nicht ausgeführt wird. Also wenn du mal alles auskommentiert hast, dann kommentier den Code wieder rein bis der Fehler wieder passiert. Dann kannst du die Schranke recht gut eingrenzen.



  • Ich hab hier grad ein ganz merkwürdiges Verhalten das ich mir nicht erklären kann:

    1. Ich habe alle Codes vom Projekt gelöst nur noch die main.cpp ohne #includes
    => Alles läuft ohne Fehler...
    2. Ich füge die Codes dem Projekt wieder hinzu
    => Alles läuft ohne Fehler...
    3. Ich füge die Includes in der main.cpp wieder dazu
    => ERROR
    4. Und hier passiert das merkwürdige mach ich den 3. Schritt rückgängig bleibt der Fehler trotzdem bestehen???

    Wie kommt das? Wenn ich den 3. Schritt rückgängig mache sollte das Projekt doch wieder bei der lauffähigen 2. Variante sein? Oder nicht?
    Was macht VC++ mit den Code, die zum Projekt hinzugefügt werden eigentlicht???

    EDIT
    ARGH! Jetzt funzt das auch nicht mehr (ohne Includes und das Projekt hat nur eine Datei main.cpp)

    EDIT
    ARG! Nochmal kompiliert und jetzt läufts wieder ?????

    EDIT3
    Jetzt läuft es ich versteh die Welt nicht mehr??? - Drehen wir uns noch um die Sonne?

    MfG
    Scarabol



  • Im Moment funktioniert es, daher mal ne kleine Zwischenfrage:

    Ich habe eine Funktion connect aus der WinSock.h und eine Klasse network die selber eine Funktion connect hat aber gleichzeitig die Funktion connect der Winsock.h benutzt:

    bool connect()
    {
    connect(...); // hier soll der die connect aus der Winsock nehmen
    }
    

    Wie kann ich entscheiden welche Funktion der Compiler benutzt?
    Muss ich einen Namespace benutzen? Geht es auch ohne?

    MfG
    Scarabol



  • Scarabol schrieb:

    Im Moment funktioniert es, daher mal ne kleine Zwischenfrage:

    Ich habe eine Funktion connect aus der WinSock.h und eine Klasse network die selber eine Funktion connect hat aber gleichzeitig die Funktion connect der Winsock.h benutzt:

    bool connect()
    {
    connect(...); // hier soll der die connect aus der Winsock nehmen
    }
    

    Wie kann ich entscheiden welche Funktion der Compiler benutzt?
    Muss ich einen Namespace benutzen? Geht es auch ohne?

    MfG
    Scarabol

    Ich denke, mit ::connect() müsstest du die Funktion aus dem globalen Namespace, also in dem Fall aus winsock.h nutzen können.



  • Danke, funktioniert.

    MfG
    Scarabol



  • Falscher Alarm funktioniert leider doch nicht er bentutz trotzdem die Funktion der Klasse nur das jetzt keine Fehlermeldung mehr kommt...

    MfG
    Scarabol



  • char buffer[1024];
    
    sizeof(buffer); // liefert das gewünschte Ergebnis 1024
    
    funktion(char *buffer)
    {
    sizeof(buffer); // liefert das "richtige" Ergebnis von 4
    sizeof(*buffer); // liefert 1 - Woher???
    // Wie kann ich jetzt hier in der Funktion das gewünschte Ergebnis von oben erzielen, also 1024?
    }
    

    MfG
    Scarabol


Anmelden zum Antworten