Segmentation Fault



  • hmm und sonnst debugging---



  • Hm, wie oben beschrieben, der Fehler tritt genau in Zeile 30 bei SDL_Flip(screen) auf und ich bin mir auch sicher, das screen vorher nicht verändert wird (so groß is mein Code nicht).

    Ich habe aber durch Hinweise aus Gamedev.net schon den dicken Fehler gefunden:

    Ich muss *bevor* ich die Klasse Frame instanziiere (also hier schon in der main() ) den

    screen=SDL_SetVideoMode(image->w, image->h, image->format->BitsPerPixel, SDL_HWSURFACE | SDL_FULLSCREEN);
    

    aufgerufen haben, sonst knallts.

    Wäre jetzt nur schön zu erfahren, warum das so ist....

    p.s. das Bild hat 1280x960, und mein Bildschirm is n 22 Zoll Breitbild TFT 😃



  • Sceletor schrieb:

    Ich muss *bevor* ich die Klasse Frame instanziiere (also hier schon in der main() ) den
    ...
    aufgerufen haben, sonst knallts.

    Echt? Hab die Funktion eigentlich selbst in eine Klasse gekapselt. Keine Ahnung warum das abstürzen sollte. Bei mir gehts ohne Probleme.

    Hast du meinen Vorschlag mit SDL_DOUBLEBUF ausprobiert?



  • Also ich hab SDL_DOUBLEBUF jetzt gerade ausprobiert, ändert aber leider nichts an meinem Problem:

    Wenn ich die SDL_SetVideoMode in eine Klasse auslagere, knallts, und zwar dann, wenn ich SDL_Flip() auf den SDL_Surface Pointer ausführe, den ich mit SDL_SetVideoMode zugewiesen habe.

    In meinem C++ Buch (aus dem ich im Moment die Ideen klaue 😃 ) hat der Autor ne Framework Klasse als Singleton, auf die er vor der Instanziierung der Game-Klasse zugreift und dort die SDL_Init() und die SDL_SetVideoMode() ausführt.

    Sein komplettes Spiel mit der Technik funktioniert bei mir, aber mein "Abklatsch" nicht. Und so groß sind die Unterschiede wirklich nicht.. *heul*



  • Tipp: Solche Fehler findet man leicht mit Duma oder Valgrind.



  • hast du evtl. selbst SDL_Init() vergessen?

    Wenn ich die SDL_SetVideoMode in eine Klasse auslagere, knallts

    Heißt das, dass wenn du SDL_SetVideoMode() innerhalb von main() aufrufst, funktioniert das ganze, ohne dass es "knallt"?
    Komisch...

    Kannst du aber evtl. den Link zu dem Thread/Artikel/Wasauchimmer hier posten. Interessiert mich auch.

    Was mir noch einfällt:
    Ich hatte mal so ein Problem mit SDL+OpenGL. Ich habe so ca. als erste Funktion srand() aufgerufen. Und eines Tages ist das Programm auch andauernd abgestürzt bzw. wurde nichts gezeichnet (, eins von beiden wars), bis ich den srand()-Aufruf entfernte. Weiß bis heute nicht warum das nicht funktionierte. Evtl. rufst du auch irgendso eine Funktion auf?

    rüdiger schrieb:

    Tipp: Solche Fehler findet man leicht mit Duma oder Valgrind.

    wenn er windows benutzt bringt ihm der tipp nicht viel. Oder habe ich da was verpasst?



  • Danke für den Hinweis, rüdiger 🙂

    Ich bin aber auch mit meinem Code::Blocks debugger nun doch noch was weiter gekommen, hab mich leider bei Dev-C++ daran gewöhnt, daß der Debugger nix kann..

    Mein Problem ist, daß der Screen pointer in meiner Frame Klasse zugewiesen wird und dann bei der Rückkehr in die main() seine Gültigkeit verliert.

    Und wenn ich dann nen flip mit dem ungültigen Pointer mache... *bumm*

    EDIT:

    Hier der link für matimatiker:
    http://www.gamedev.net/community/forums/topic.asp?topic_id=434947



  • wenn ich den typen richtig verstanden habe. so hat er vergessen sdl vorher zu initialisieren:

    And If anyone else sees this .. well ... never do anything in main before you initalize SDL. _

    Bei dir fehlt auch der SDL_Init() aufruf



  • Also erstmal hab ich SDL_Init() definitiv aufgerufen, wie gesagt, ich hab ein Problem damit, dass mein pointer verloren geht wenn ich von ner Klasse zurück in die main() gehe. Das ist DEFINITIV das ganze Problem, und ich arbeite im Moment an ner Lösungsstrategie, wird wohl wahrscheinlich auf ne globale Variable hinauslaufen...

    Und der Typ meint was da steht: Man soll nix in der main() machen *bevor* man SDL initialisiert hat, es geht also um die Reihenfolge 🙂



  • Sceletor schrieb:

    Also erstmal hab ich SDL_Init() definitiv aufgerufen.

    Wie gesagt, ich kann noch keine Gedanken lesen. Mit der Textsuche, habe ich es aber in dem geposteten Quelltext nicht finden können.

    Bevor du auf globale Variablen zurückgreifst, hast du schon SDL_GetVideoSurface() probiert?



  • Sorry, ich wollte wirklich nicht unfreundlich sein.

    Und SDL_GetViedoSurface hört sich ganz gut an 🙂 Gleich mal ausprobieren..



  • COOL!!!!! Mit SDL_GetVideoSurface() gehts!!!

    Ich weiss zwar nicht, warum der Code aus dem Buch geht, obwohl es eigentlich der gleich ist, aber so kann ich erstmal prima weiterarbeiten, nachdem ich mich jetzt 2 Tage mit dem segmentation fault bei dem Zeiger rumgeschlagen habe.

    VIELEN VIELEN dank an matimatiker!

    Ich habe aber noch eine Frage:

    Wenn das Programm nun startet, ist der Bildschirm erstmal schwarz und bleibt es auch bis ich entweder das Fenster in Windows mit einem anderen verdecke und wieder sichtbar mache oder bis er beim Debuggen in der Methode SDL_PollEvents() angekommen ist.

    Muss also was mit den beiden Surfaces sein... Wodurch wird so ein Verhalten ausgelöst?

    EDIT: Habs schon, meine SDL_Flip() hatte auch den falschen Screen...


Anmelden zum Antworten