SDL: Problem beim Beenden des Programms
-
Ich hab kürzlich mein erstes kleines Spiel geschrieben... Es besteht im Grossen und ganzen aus 2 While-Schleifen, dem Hauptmenü und der Spieloberfläche.
Jetzt hab ich ein Problem: Ich weiss nicht, wie ich das Programm beenden soll. Das mag zwar lächerlich klingen, doch ich weiss es echt nicht.
Ich habs mit exit(0) probiert (dabei steht atexit(SDL_Quit) am Anfang in main), doch dann kommt die Fehlermeldung, mein Programm habe einen Fehler festgestellt und müsse beendet werden. Das kommt aber nur vor, wenn ich mehrmals vom Hauptmenü ins Spiel und wieder zurück gewechselt habe (also mindestens 1 mal war ich im Spiel). Wenn ich direkt aus dem Hauptmenü beende, ohne die Spieloberfläche aufzurufen, geht das Beenden einwandfrei. Das gleiche passiert auch, wenn ich von der Spieloberfläche beenden will. Das kanns ja wohl nicht sein.
Im Übrigen hab ich probiert, beide While-Schleifen-Variabeln (ImHauptmenu, ImSpiel) auf false zu setzen, damit die Schleifen übersprungen werden und das Ende von Main erreicht wird. Doch das hat auch nicht geklappt...
Ich könnte mir vorstellen, dass ich etwas aus dem Speicher nicht gelöscht habe, doch wie es genau funktionieren könnte, weiss ich leider nicht. Muss mit SDL_FreeSurface den Grafikspeicher wieder freigegeben werden (wenn ja, bei welchen Surfaces; ich hab z.B. screen, bild)? Bis jetzt hab ich das eigentlich nie gemacht, ich hatte auch nie Probleme...Der Aufbau in der main-Funktion sieht grob folgendermassen aus:
int main { while (ImHauptmenu) { ... // Abfragen ob Schliessen mit Events } while (ImSpiel) { ... // Wieder Events abfragen } }
-
starte das programm in einem debugger, dann sollte man sehen wo er abstürzt... so kann man dazu nicht viel sagen.
-
Inzwischen hab ich noch etwas herausgefunden: Das Problem kommt nur vor, wenn man das Programm vom Compiler aus ausführt. Wenn man die Exe-Datei direkt startet, läuft alles einwandfrei... Auch wenn ich in den Debugger-Modus gehe, läuft es ohne Beschwerden... Es registriert nicht mal einen Fehler...
Wie ist das möglich? Ich denke, das Programm sollte immer gleich ausgeführt werden?
-
Wäre immer noch aktuell...
Weiss niemand eine Antwort auf mein Problem? Ist das noch niemandem unterfahren?
-
Ich nehme mal an, da niemand geantwortet hat, ist das Problem unbekannt und ihr wisst auch keine Lösung dafür. Trotzdem danke...
Falls ihr etwas dazu wisst (ihr müsst euch ja nicht sicher sein!) gebt mir bitte auf jeden Fall Bescheid, ich würde gerne die Ursache kennen, wieso das Programm beim Beenden abstürzt...
Gruss Nexus
-
das klingt so als hättest du in deinem Spiel speicher alloziiert und ihn dann nicht mehr freigegeben. Also solltest du mal nachschauen, ob beim beenden du zu jedem new ein delete aufgerufen wurde. Ein Debugger hilft da immer weiter, welche IDE benutzt du den?
-
Nexus schrieb:
Ich könnte mir vorstellen, dass ich etwas aus dem Speicher nicht gelöscht habe, doch wie es genau funktionieren könnte, weiss ich leider nicht. Muss mit SDL_FreeSurface den Grafikspeicher wieder freigegeben werden (wenn ja, bei welchen Surfaces; ich hab z.B. screen, bild)? Bis jetzt hab ich das eigentlich nie gemacht, ich hatte auch nie Probleme...
Ja, tu das mal. Alle geladenen Surfaces, Fonts etc wieder freigeben ist schon noch wichtig. Ausserdem solltest du SDL richtig beenden.
Alle SDL Funktionen geben bei Fehlern eine exit-code zurück und ausserdem kannst du die Fehler mit SDL_GetError() abfragen.
Fehlerbehandlung ist in SDL nicht zu schwer:int SDL_main( int argc, char* argv[] ) { try { SDL_Surface* Screen = NULL ; if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) throw SDL_GetError() ; Screen = SDL_SetVideoMode( 640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF ) ; if( Screen == NULL ) throw SDL_GetError() ; // code here } catch( char* strError ) { cerr << strError << '\n' ; } SDL_Quit() ; return 0 ; }// Loads Mario.png into an SDL_Surface SDL_Surface* imgMario = IMG_Load( "assets/Mario.png" ) ; if( imgMario == NULL ) // Check for validity. throw IMG_GetError() ; // Same as SDL_GetError but reports problems with image files. DrawImage( imgMario, 0, 0, Screen ) ; // Invoke the drawing function we made earlier. SDL_FreeSurface( imgMario ) ; // Deletes the surface at the end of the program.Quelle: http://www.devmaster.net/wiki/SDL_Lesson_1:_The_Foundation#The_Images