Pointer und SDL
-
Also, ich bin mir nicht ganz sicher, ob das nun ein C++ oder SDL Problem ist, aber ich denke, daß es wohl mehr mit SDL zu tun hat, also schreibe ich es hier rein.
Ich versuche im Moment, einige Klassen, die ich aus einem Buch habe, für mein eigenes Projekt zu "konvertieren", bin auch schon recht weit gekommen, aber habe nun ein sehr mysteriöses Problem:
Im Prinzip will ich nur ein Bildchen anzeigen, und das mit den schicken Wrapper Klassen des Buchautors.
Das hier ist im Moment meine main():
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <gl/gl.h> #include "Framework.hpp" int main(int argc, char *argv[]){ SDL_Surface *screen, *image; SDL_Event event; int done = 0; if(pointer_FrameWork->init(1280,960,24,true) == false) { return(0); } image=IMG_Load("Images/welcome.png"); screen = pointer_FrameWork->getScreen(); SDL_Flip(screen); /* the event loop, redraws if needed, quits on keypress or quit event */ while(!done && SDL_WaitEvent(&event)!=-1) { switch(event.type) { case SDL_KEYDOWN: case SDL_QUIT: /* quit events, exit the event loop */ done=1; break; case SDL_VIDEOEXPOSE: /* need a redraw, we just redraw the whole screen for simplicity */ SDL_BlitSurface(image,0,screen,0); SDL_Flip(screen); break; default: break; } } /* free the loaded image */ SDL_FreeSurface(image); /* shutdown SDL */ SDL_Quit(); return(0); }bis Zeile 26 geht alles problemlos, aber die Zuweisung da scheint nicht zu klappen. Wenn ich statt dem "Umweg" über die getScreen() Methode in der Framework klasse direkt den Screen initialisiere mit
screen=SDL_SetVideoMode(image->w, image->h, image->format->BitsPerPixel, SDL_ANYFORMAT);funktioniert alles, aber mit der getScreen() Methode nicht, was ich mir absolut nicht erklären kann.
Hier noch die Framework.hpp:
#ifndef FRAMEWORK_HPP #define FRAMEWORK_HPP #include <iostream> #include "Singleton.hpp" #include "Timer.hpp" using namespace std; #define pointer_FrameWork Framework::get() class Framework : public TSingleton<Framework> { public: bool init(int screenWidth, int screenHeight, int colordepth, bool fullscreen); void quit(); void update(); void clear(); void flip(); bool keyDown (int keyID); SDL_Surface *getScreen() {return pointer_Screen;} private: SDL_Surface *pointer_Screen; Uint8 *pointer_KeyState; }; #endifund die Framework.cpp:
#include "Framework.hpp" bool Framework:: init(int screenWidth, int screenHeight, int colordepth, bool fullscreen) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { cout << "SDL Video konnte nicht initialisiert werden!" << endl; cout << "Fehlermeldung: " << SDL_GetError() << endl; quit(); return(false); } if (fullscreen == true) { pointer_Screen = SDL_SetVideoMode(screenWidth, screenHeight, colordepth, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN); if (pointer_Screen == NULL) { cout << "pointer_Screen = NULL!" << endl; } } else { pointer_Screen = SDL_SetVideoMode(screenWidth, screenHeight, colordepth, SDL_HWSURFACE | SDL_DOUBLEBUF); } if (pointer_Screen == NULL) { cout << "Videomodus konnte nicht gesetzt werden!" << endl; cout << "Fehlermeldung: " << SDL_GetError() << endl; quit(); return(false); } pointer_KeyState = SDL_GetKeyState(NULL); return(true); } void Framework::quit() { SDL_Quit(); } void Framework::update() { pointer_Timer->update(); SDL_PumpEvents(); } bool Framework::keyDown(int keyID) { return (pointer_KeyState[keyID] ? true : false); } void Framework::clear() { SDL_FillRect(pointer_Screen, NULL, SDL_MapRGB(pointer_Screen->format,0,0,0)); } void Framework::flip() { if(pointer_Screen == NULL) { cout << "pointer_screen war NULL" << endl; } SDL_Flip(pointer_Screen); cout << "Bin in FrameWork::flip()" << endl; }Wäre wirklich super wenn mir da jemand weiterhelfen könnte, erspart mir sicher einige Stunden suchen und ausprobieren

-
Sceletor schrieb:
bin auch schon recht weit gekommen, aber habe nun ein sehr mysteriöses Problem
Wenn du so freundlich wärst, uns das Problem mitzuteilen, könnte dir sicher auch jemand helfen.
-
Sceletor schrieb:
bis Zeile 26 geht alles problemlos, aber die Zuweisung da scheint nicht zu klappen. Wenn ich statt dem "Umweg" über die getScreen() Methode in der Framework klasse direkt den Screen initialisiere mit
screen=SDL_SetVideoMode(image->w, image->h, image->format->BitsPerPixel, SDL_ANYFORMAT);funktioniert alles, aber mit der getScreen() Methode nicht, was ich mir absolut nicht erklären kann.
Wer lesen (scrollen?) kann, ist klar im Vorteil

Ne, aber im Ernst, wenn ich das dann so kompiliere und ausführe kommt kurz ein schwarzer Bildschirm und er verlässt die Anwendung wieder (ohne Fehlermeldung).
Wenn ich screen wie oben im Code beschrieben zuweise, zeigt er mir auch das Bild an.Durch Testen habe ich heraus bekommen, daß der SDL_Flip() nicht ausgeführt wird, was wohl wie bereits geschrieben an der Zuweisung in Zeile 26 liegen wird.
-
Sceletor schrieb:
Durch Testen habe ich heraus bekommen...
lass mich raten, du bist ein weiterer held dieses forums der keinen debugger benutzt?
-
rapso schrieb:
Sceletor schrieb:
Durch Testen habe ich heraus bekommen...
lass mich raten, du bist ein weiterer held dieses forums der keinen debugger benutzt?
Nein, ich denke nicht, aber da ich leider neu bei der C++ Programmierung bin, half mir der Debugger (also in meinem konkreten Fall die Fehlersuche in Dev-C++) gar nicht weiter, genaugenommen brach er sofort ab

Aber ich werde deine freundliche Anregung natürlich aufgreifen und mich nochmal mit dem Debugger auseinandersetzen.
-
Hmm... so beim ersten Durchlesen kann ich auch keinen Fehler finden, also wie gesagt, schau mal mit einem Debugger nach. Aber:
Sceletor schrieb:
Ne, aber im Ernst, wenn ich das dann so kompiliere und ausführe kommt kurz ein schwarzer Bildschirm und er verlässt die Anwendung wieder (ohne Fehlermeldung).
SDL leitet (unter Windows) die Ausgaben immer in Textdateien um. Schau mal nach obs im Verzeichnis, wo deine .exe liegt, eine "stdout.txt" oder eine "stderr.txt" gibt, und ob da Fehlermeldungen drin stehen.
Ansonsten: Du machst sehr viele Vergleiche auf true oder false, das ist eigentlich relativ sinnlos. Ueblicherweise schreibt man statt
if (isBedingungErfuellt == true) if (isAndereBedingungErfuellt == false)lieber
if (isBedingungErfuellt) if (!isAndereBedingungErfuellt)Bei NULL geht das auch, aber das ist dann halt Geschmacksache.
-
Danke BlueTiger, aber das weiss ich schon.
Das fiese an meinem Problem ist einfach, daß da keine Fehlermeldung kommt und ich daher keine Anhaltspunkte dafür habe, was den Fehler auslöst.
-
Sceletor schrieb:
rapso schrieb:
Sceletor schrieb:
Durch Testen habe ich heraus bekommen...
lass mich raten, du bist ein weiterer held dieses forums der keinen debugger benutzt?
Nein, ich denke nicht, aber da ich leider neu bei der C++ Programmierung bin, half mir der Debugger (also in meinem konkreten Fall die Fehlersuche in Dev-C++) gar nicht weiter, genaugenommen brach er sofort ab

wenn er abbricht zeigt er die stelle und den grund weshalb er das tat... normalerweise.
-
Kennt ihr euch mit Dev-C++ aus? Ich benutze den Dev-C++ Debugger, und der gibt sich leider recht schweigsam.
Immerhin kann ich (nach dem ich sinnigerweise den Vollbildmodus abgeschaltet habe) jetzt das Programm mit dem Debugger starten, nur leider stört der sich nicht im mindesten an meinen Breakpoints

Wenn ich den Debugger anmache, macht der einfach ein Fenster auf (obwohl ich zum Test direkt als erstes in der main() einen Breakpoint gesetzt habe) und meldet danach einen "segmentation fault"... immerhin.
Wo der nun genau auftritt sagt er mir leider nicht, zumindest nicht per Markierung oder Cursor.
Unter "Ausgabe" im Debugger stand auch was von segmentation fault und SIGSEGV, aber das ist etwas viel zum Tippen, Copy-Paste geht (aus welchen Gründen auch immer) in der Dev-C++ Ausgabe nicht *grml*
-
normalerweise muss man extra noch im debug mit debug-symbols bauen (komplett neu bauen wenn das flag nicht an war), damit der debugger code-binary zusammenhalten kann.
-
Du meinst:
-ggdb3 -g3beim Compiler und Linker eintragen?