Compile-Fehler beim Init von SDL [GELÖST]



  • hi.

    ich finde einfach den fehler nicht, wieso der compiler abbricht ...

    void InitSDL()
    {
        int VideoFlags;
    
        SDL_Surface *pSurface = NULL;
    
        const SDL_VideoInfo *pVideoInfo = NULL;
    
        // Init SDL
        SDL_Init ( SDL_INIT_VIDEO );
    
        // VideoInfo
        pVideoInfo = SDL_GetVideoInfo();
    
        // Standard VideoFlags
        VideoFlags = SDL_OPENGL;
        VideoFlags |= SDL_GL_DOUBLEBUFFER;
        VideoFlags |= SDL_HWPALETTE;
        VideoFlags |= SDL_RESIZABLE;
    
        // GPU-Speicher prüfen
        VideoFlags |= ( pVideoInfo->hw_available ) ? SDL_HWSURFACE : SDL_SWSURFACE;
    
        // Hardware-Blits
        if ( pVideoInfo->blit_hw ) VideoFlags |= SDL_HWACCEL;
    
        // OpenGL Double-Buffering
        SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    
        // Surface erstellen
        pSurface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, VideoFlags );
    }
    

    und beim erstellen der surface bricht er mit folgender meldung ab ...

    error: expected primary-expression before ‘,’ token
    

    SCREEN_* sind ok ... videoflags ebenfalls. übersehe ich etwas?

    danke im voraus.


  • Mod

    welche zeile?



  • hoppla ... 38


  • Mod

    jetzt waere natuerlich die deklaration von
    SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP
    interresant.



  • #define SCREEN_HEIGHT 640
    #define SCREEN_WIDTH 480
    #define SCREEN_BPP 16
    


  • Hm... Scheint alles zu stimmen. Bist du dir sicher, dass das der erste Fehler ist? Und wenn du die Zeile auskommentierst, funktioniert alles?

    Noch eine Anmerkung zu deiner Funktion:

    void InitSDL() 
    { 
        SDL_Surface *pSurface = NULL; 
        pSurface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, VideoFlags ); 
    }
    

    Du erstellst einen lokalen Zeiger auf eine SDL_Surface , der am Schluss der Funktion zerstört wird. Der per SDL_SetVideoMode() allokierte Speicher existiert allerdings weiterhin, womit du ein Memory Leak erzeugt hast.

    Meinst du nicht, du benötigst die Oberfläche auch ausserhalb der Funktion?



  • yup, das ist der erste fehler. arbeite mit codeblocks, da wird der erste fehler schön mit ner markierung hervorgehoben. 🙂

    ja, hab schon einiges versucht. schritt für schritt. und nach auskommentieren dieser zeile war alles ok.

    hier nochmal ein auszug aus der sdl-doc:

    // Set the video mode
    SDL_Surface* myVideoSurface = SetVideoMode(640, 480, 16, SDL_DOUBLEBUF|SDL_FULLSCREEN);
    

    in meinem code passiert ja eigentlich nichts anderes. und zum thema lokaler zeiger ... nach InitSDL() ist bisher nur InitOpenGL() und ist noch nicht implementiert. 🙂

    und was bedeutet "Memeroy Leak" ?



  • Schon mal ausprobiert die Flags und Parameter direkt zu setzen, anstatt über "VideoFlags" ?



  • yup.



  • fehler gefunden ... hatte mich beim #define vertippt. 😉 danke für die hilfe!



  • noch etwas fällt mir ein ... sollte man in c++ mit globalen variablen sehr sparsam umgehen? in php zumindest werden sie verteufelt.

    und was genau ist ein memory leak?



  • snik schrieb:

    noch etwas fällt mir ein ... sollte man in c++ mit globalen variablen sehr sparsam umgehen? in php zumindest werden sie verteufelt.

    und was genau ist ein memory leak?

    Globale Variablen sind zu vermeiden

    UND:

    http://de.wikipedia.org/wiki/Memory_leak



  • Was wie vorher angedeutet auch ein Problem darstellt, ist die Tatsache, dass der Zeiger auf die SDL_Surface nur lokal (also innerhalb von InitSDL() ) existiert. Ich denke aber, du willst die Oberfläche nach der Initialisierung von SDL noch weiterverwenden.

    Kuldren schrieb:

    Globale Variablen sind zu vermeiden

    Da ich mich mit solchen "Argumenten" grundsätzlich nicht zufrieden gebe, habe ich vor einiger Zeit hier mal einen Thread eröffnet, in dem die Problematik globaler Variablen diskutiert worden ist.

    Das Memory Leak kannst du vermeiden, indem du SDL_FreeSurface() aufrufst, wenn du die SDL_Surface nicht mehr benötigst. Tja, das ist halt das Problem an C-Bibliotheken, da muss man alles selber initialisieren und zerstören... Ansonsten, wenn du C++ programmierst, wäre eventuell eine Klasse angebracht, die diese Aufgabe übernimmt. Du kannst du dir vielleicht auch einmal die Grafikbibliothek SFML anschauen.



  • Nexus schrieb:

    Kuldren schrieb:

    Globale Variablen sind zu vermeiden

    Da ich mich mit solchen "Argumenten" grundsätzlich nicht zufrieden gebe, habe ich vor einiger Zeit hier mal einen Thread eröffnet, in dem die Problematik globaler Variablen diskutiert worden ist.

    Mit "zu vermeiden" meinte ich dass nicht für alles sofort eine globale Variable angelegt werden sollte, weil man es meist doch anders lösen kann.



  • Kuldren schrieb:

    Mit "zu vermeiden" meinte ich dass nicht für alles sofort eine globale Variable angelegt werden sollte, weil man es meist doch anders lösen kann.

    Naja, das hab ich mir schon gedacht. Trotzdem wäre es doch noch interessant gewesen, wieso es bessere Lösungen gibt, bzw. was schlecht daran ist.


Log in to reply