Anfängerfehler



  • Hi,

    mein Projekt ist mit der Zeit immer weiter gewachsen, zwischendurch gabs mal den ein oder anderen illegalen Speicherzugriff, doch mittlerweile lässt es sich gar nicht mehr starten.

    Ich denke das liegt vor allem daran, dass ich nicht so sehr auf eine klare Struktur geachtet habe.

    Gibt es eine Methode das ich mein Projekt wieder ordnen kann ohne gleich alles neuschreiben zu müssen?

    MfG
    Scarabol



  • Schritt 1) bringe dein Projekt wieder zum Laufen. Entweder indem du die Änderung rückgängig machst die es kaputtgemacht hat, oder indem du mit Debugger & Co rausfindest warum es nicht mehr startet udn den Fehler behebst.

    Schritt 2) Fang an, dein Projekt schrittweise zu ordnen, indem du immer kleine Umbauten vornimmst und danach sicher stellst dass es immernoch läuft und richtig funktioniert.

    Dieses Umordnen und verbessern solltest du grundsätzlich immer wieder zwischendurch mal machen, sonst gerät dir dein Code irgendwann wieder außer Kontrolle und geht in die Brüche.
    Außerdem solltest du Änderungen am Code entweder in einem Versionskontrollsystem archivieren damit du sie im Notfall rückgängig machen kannst, oder klein genug halten und zwischendurch immer wieder schauen dass es auch funktioniert.



  • Gut danke, das klingt einleuchtend, dann fang ich mal an.

    MfG
    Scarabol



  • Hallo,

    ich hab eine Header Datei math.h mit Mathefunktionen. Die Funktionen werden sowohl in der user.h als auch in der gui.h gebraucht.

    user.h

    #include "math.h"
    

    gui.h

    // Was muss ich in dieser Datei noch includen, damit ich die Funktionen aus math.h und aus user.h benutzen kann?
    // reicht hier:
    #include "user.h"
    // weil in user.h ja bereits die math.h eingefügt wurde oder muss ich das so aufrufen
    #include "math.h"
    #include "user.h"
    

    MfG
    Scarabol



  • Scarabol schrieb:

    Hallo,

    ich hab eine Header Datei math.h mit Mathefunktionen. Die Funktionen werden sowohl in der user.h als auch in der gui.h gebraucht.

    user.h

    #include "math.h"
    

    gui.h

    // Was muss ich in dieser Datei noch includen, damit ich die Funktionen aus math.h und aus user.h benutzen kann?
    // reicht hier:
    #include "user.h"
    // weil in user.h ja bereits die math.h eingefügt wurde oder muss ich das so aufrufen
    #include "math.h"
    #include "user.h"
    

    MfG
    Scarabol

    Hast du's mal ausprobiert? Es sollte laufen, wenn du nur user.h includierst. Du musst also math.h nicht noch einmal einbinden.

    Allerdings halte ich das für keine so gute Idee. Falls du irgend wann einmal math.h in user.h nicht mehr brauchst und es rausschmeißt, kriegst du in allen möglichen, nicht vorhersehbaren Dateien Fehler.

    Man sollte immer die Dateien includen, die man auch braucht. In sofern ist dein zweites Beispiel besser.

    Stefan.



  • Gut, danke.

    Noch ein Problem wenn ich mein Projekt starte läuft alles wunderbar. Erst wenn ich das Programm beende bekomme ich einen illegalen Speicherzugriff angezeigt.
    Woran liegt das?

    MfG
    Scarabol



  • Scarabol schrieb:

    Woran liegt das?

    Meine Glaskugel ist zerbrochen, und was DEIN Debugger als Antworten gibt, können wir nicht ahnen.



  • Ausgabe

    Eine Ausnahme (erste Chance) bei 0x0040cd43 in starfighter_online.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009.
    Unbehandelte Ausnahme bei 0x0040cd43 in starfighter_online.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009.
    

    Aufrufbrowser

    starfighter_online.exe!irr::core::irrAllocator<char>::deallocate(char * ptr=0x0041e6e8)  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++
    

    irrAllocator.h (gehört zu Irrlicht, 3D Engine)

    //! Deallocate memory for an array of objects
    	void deallocate(T* ptr)
    	{
    		internal_delete(ptr); // <<<<<< hier Error
    	}
    

    MfG
    Scarabol



  • Da wird anscheinend Speicher freigegeben, welcher bereits freigegeben worden ist oder einfach auf nichts sinnvolles zeigt.

    Sprich der Aufrufkontext der Funktion ist fehlerhaft. Ich würde mal darauf tippen, dass du da die deallokation in einem Destruktor hast und du dann das Objekt kopierst (sprich auch der Zeiger) wird kopiert und du hast dann 2x eine deallokation auf den gleichen Speicherbereich. Das ist ein üblicher Fehler.

    Ansonsten zeig mal die (relevante) Umgebung, wo du die Funktion aufrufst. (und der Fehler passiert).



  • drakon schrieb:

    Ansonsten zeig mal die (relevante) Umgebung, wo du die Funktion aufrufst. (und der Fehler passiert).

    Der Debugger springt direkt in die Header Datei, ich weiß also nicht wo im Programm der Fehler passiert und die Funktion wird einige Male verwendet...

    MfG
    Scarabol



  • der Debugger wird vermutlich an die Stelle springen wo die Exception auftritt - und im Stacktrace solltest du dann sehen von wo aus deinem Programm der Ablauf an die Stelle gelangt ist. Irgendwo wird eine von dir geschrieben Funktion im Stacktrace stehen und davor setzt du beim nächsten Debugdurchlauf am besten mal einen Breakpoint und schaust dir die Werte an, ob sie gut sind.



  • Wie finde ich den "Stacktrace" bei Visual C++ 2008 + SP1 ?

    MfG
    Scarabol



  • Das ding heißt dort Callstack oder so ähnlich - auf deutsch weiß ichs ehrlich gesagt nicht - "aufrufreihenfolge" oder was öhnliches vielleicht? Wenn du beim Debuggen bist müsstest du das Fenster mit Alt+7 öffnen können.



  • view -> other windows -> call browser
    heißt es im englischen - obwohl ich auch immer dachte, dass es call stack hieß : D

    hat bei mir keinen short cut
    (MSVC 2008 prof.)

    bb



  • 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


Anmelden zum Antworten