2017-01-30 4 views
0

Ceci est juste supposé afficher une image bmp dans le tampon avant de la fenêtre SDL. J'ai joué avec le code. Et je pense qu'il y a quelque chose qui ne va pas avec ma fonction init(). Je suis nouveau à SDL. Mais il doit y avoir un problème avec mes pointeurs ou quelque chose qui me manque sur les fucntions de SDL EDIT: J'ai utilisé GDB et il s'est avéré que ma fonction close() était le problème. Je crois que c'était parce que je libérais de la mémoire qui était définie sur NULL? Je me suis débarrassé de la fonction proche et juste libéré mem après ma fonction de retard.Erreur de segmentation initialisant SDL2. Qu'est-ce que je fais de mal avec la mémoire?

#include <SDL2/SDL.h> 
#include <stdio.h> 
#include <stdbool.h> 
#define SCREENWIDTH 640 
#define SCREENHEIGHT 480 
SDL_Window *win = NULL; 
SDL_Surface *scrn = NULL; 
SDL_Surface *mscrn = NULL; 
bool init() 
{ 
    bool suc = true; 
    char name[11] = "Hello SDL"; 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
    win = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREENWIDTH, SCREENHEIGHT, SDL_WINDOW_SHOWN); 
    if (win == NULL) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
scrn = SDL_GetWindowSurface(win); 

return suc; 
} 
bool loadmedia() 
{ 
    bool suc = true; 
    mscrn = SDL_LoadBMP("hello_world.bmp"); 
    if (mscrn == NULL) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
    return suc; 
} 
void close() 
{ 
    SDL_FreeSurface(mscrn); 
    SDL_DestroyWindow(win); 
    SDL_Quit(); 
} 
int main(int argc, char* args[]) 
{ 
if (!init()) { 
    close(); 
    return 1; 
    } 
    if (!loadmedia()) { 
    close(); 
    return 1; 
    } 
    SDL_BlitSurface(mscrn, NULL, scrn, NULL); 
    SDL_UpdateWindowSurface(win); 
    SDL_Delay(3000); 

    close(); 
    return 0; 
} 
+1

Qu'est-ce que votre compilateur vous dit à propos de 'close()'? – EOF

+0

Qu'est-ce que «close» est censé faire, de toute façon? –

+0

Wild deviner: Si SDL_Init échoue, vous message (et ne le voyez jamais parce qu'il n'y a pas de saut de ligne et donc pas de vidage implicite), mais alors marchez et essayez de créer une fenêtre de toute façon. De même avec la surface des fenêtres. Un * débogueur * est dans le menu à ce stade. – WhozCraig

Répondre

3

Vous devriez trouver un débogueur raisonnable et d'autres outils pour trouver quelle ligne est à l'origine de l'erreur et pourquoi. Fondamentalement, il se résume à utiliser un débogueur qui vient généralement avec votre IDE si vous en utilisez un, ou en utilisant le très bon outil d'analyse de code, Valgrind.

Si vous utilisez gcc, vous pouvez probablement utiliser gdb pour déboguer votre programme facilement. Voici quelques ressources sur la façon de vous aider à diagnostiquer les erreurs de segmentation:

vous familiariser avec ces outils, car ils vous sauver d'innombrables heures à l'avenir quand vous faites face à nouveau problèmes.

+0

Merci! gdb m'a toujours confondu jusqu'à ce que je clique sur votre lien et apprenne la commande "backtrace" – ZhangBing