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
ScarabolHast 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ß : Dhat 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