2017-01-30 8 views
0

이것은 bmp 이미지를 SDL 윈도우 프런트 버퍼에 표시하는 것으로 가정합니다. 코드를 가지고 놀았습니다. 그리고 내 init() 함수에 문제가 있다고 생각합니다. SDL을 처음 사용합니다. 하지만 내 포인터 또는 내가 SDL 기능에 대해 놓친 뭔가가 있어야합니다. 편집 : 나는 GDB를 사용하고 그것이 내 close() 함수가 문제라고 판명했다. 나는 그것이 NULL로 설정된 메모리를 해제했기 때문에 그것이라고 생각합니까? 나는 가까운 연기를 없애고 지연 기능을 수행 한 후에 mem를 해방했다.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

어쨌든'close'가해야 할 일은 무엇입니까? –

+0

야생 추측 : SDL_Init이 실패 할 경우 메시지가 표시됩니다 (줄 바꿈 줄이없고 암시 적 플러시가 없어 보이지 않음). 그런 다음 행을 만들고 행을 만들려고합니다. 윈도우 표면과 마찬가지로. 이 시점에서 A * 디버거 *가 메뉴에 있습니다. – WhozCraig

답변

3

적절한 디버거와 다른 도구를 사용하여 오류의 원인과 원인을 찾을 수 있습니다. 기본적으로 IDE를 사용하는 경우 IDE와 함께 제공되는 디버거를 사용하거나 Valgrind라는 매우 우수한 코드 분석 도구를 사용합니다.

gcc를 사용한다면 gdb를 사용하여 프로그램을 쉽게 디버깅 할 수 있습니다. 새로운 직면 할 때이 당신에게 많은 시간을 절약 할 수로

가 이러한 도구에 익숙 받기 : 여기에 세그멘테이션 오류를 진단하는 방법에 대한 몇 가지 리소스입니다 문제.

+0

고맙습니다! gdb는 링크를 클릭하고 "백 트레이스"명령을 배울 때까지 항상 혼란스러워했습니다. – ZhangBing