2017-01-30 2 views
0

Предположим, чтобы отобразить BMP-изображение в переднем буфере окна SDL. Я играл с кодом. И я думаю, что что-то не так с моей функцией init(). Я новичок в SDL. Но должна быть проблема с моими указателями или что-то, что мне не хватает в функциях SDL EDIT: Я использовал GDB, и оказалось, что моя функция close() была проблемой. Я считаю, что это было потому, что я освобождал память, которая была установлена ​​в NULL? Я избавился от близкого будущего и просто освободил память после моей функции задержки.Идентификация сбоя сегментации SDL2. Что я делаю неправильно с памятью?

#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

Что ваш компилятор говорит вам о 'close()'? – EOF

+0

Какое «закрытие» должно делать, во всяком случае? –

+0

Дикая догадка: если SDL_Init терпит неудачу, вы получаете сообщение (и никогда не увидите его, потому что нет конечной новой строки и, следовательно, нет неявного флеша), но затем маршируйте и пытайтесь создать окно в любом случае. Аналогично с поверхностью окна. В этот момент в меню находится отладчик * *. – WhozCraig

ответ

3

Вы должны найти разумный отладчик и другие инструменты, чтобы выяснить, какая строка вызывает ошибку и почему. В основном это сводится к использованию отладчика, который обычно поставляется с вашей IDE, если вы используете его, или с помощью очень хорошего инструмента анализа кода Valgrind.

Если вы используете gcc, вы можете использовать gdb для отладки вашей программы. Вот некоторые ресурсы о том, как помочь диагностировать ошибки сегментации:

Разберитесь с этими инструментами, так как они будут вам сэкономить огромное количество времени в будущем, когда вы сталкиваетесь с новым проблемы.

+0

Спасибо! gdb всегда путал меня, пока я не щелкнул ссылку и не узнал команду «backtrace» – ZhangBing

Смежные вопросы