2016-09-18 7 views
1

C++ 및 SDL2에 대한 Lazy Foo 자습서를 따르고 있습니다. 정규 C를 사용하여 그것을 배우려고 노력 중이며 이벤트를 추가하여 닫기 창 이벤트를 감지하는 지침에 따라 흥미로운 것을 발견했습니다.Can not Close Window

다음은 코드입니다.

#include <stdio.h> 
#include <stdbool.h> 
#include "SDL2/SDL.h" 

bool init(); 
bool loadMedia(); 
void close(); 

const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

SDL_Window *gWindow = NULL; 
SDL_Surface *gScreenSurface = NULL; 
SDL_Surface *gHelloWorld = NULL; 

int main(int argc, char *argv[]) 
{ 
    if(!init()) { 
     printf("Failed to initialize!\n"); 
    } 
    else { 
     if(!loadMedia()) { 
      printf("Failed to load media!\n"); 
     } 
     else { 
      bool quit = false; 
      SDL_Event e; 

      while(!quit) { 
       printf("%d", SDL_PollEvent(&e)); 

       while(SDL_PollEvent(&e) != 0) { 
        if(e.type == SDL_QUIT) { 
         quit = true; 
        } 
       } 

       SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL); 
       SDL_UpdateWindowSurface(gWindow); 
      } 
     } 
    }  

    close(); 

    return 0; 
} 

bool init() 
{ 
    bool success = true; 

    if(SDL_Init(SDL_INIT_VIDEO) < 0) { 
     printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); 
     success = false; 
    } 
    else { 
     gWindow = SDL_CreateWindow("SDL Tutorial 03", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 

     if(gWindow == NULL) { 
      printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); 
      success = false; 
     } 
     else { 
      gScreenSurface = SDL_GetWindowSurface(gWindow); 
     } 
    } 

    return success; 
} 

bool loadMedia() 
{ 
    bool success = true; 

    gHelloWorld = SDL_LoadBMP("images/hello_world.bmp"); 

    if(gHelloWorld == NULL) { 
     printf("Unable to load image %s! SDL_Error: %s\n", "images/hello_world.bmp", SDL_GetError()); 
     success = false; 
    } 

    return success; 
} 

void close() 
{ 
    SDL_FreeSurface(gHelloWorld); 
    gHelloWorld = NULL; 

    SDL_DestroyWindow(gWindow); 
    gWindow = NULL; 

    SDL_Quit(); 
} 

".c"확장명으로 컴파일하면 오류없이 컴파일되지만 창 제목 표시 줄에서 "X"를 선택하면 아무런 효과가 없습니다. 확장명을 ".cpp"로 변경하면 "X"가 의도 한대로 작동합니다.

다음 명령을 사용하여 코드를 컴파일하고 있습니다.

gcc main.c -w -lSDL2 -o main 

C++에서는 작동하지만 C에서는 작동하지 않는 이유는 무엇입니까?

+4

: 당신은 단지 대기열에 보류중인 이벤트가 있는지 확인하려면

printf("%d", SDL_PollEvent(&e)); while(SDL_PollEvent(&e) != 0) { if(e.type == SDL_QUIT) { quit = true; } } 

은 다음 NULL 인수 함수 SDL_PollEvent를 사용하는이 이벤트 루프가이 이벤트를 찾을 수 없음을 의미합니다 'close()'호출에서 범위 문제일까요? '-w'로 경고를 무시하는 대신 경고를 확인할 수 있습니까? C 명령 행에서'close'를 언급하고있을 것입니다. –

+1

'컴파일러에게 물건이 망가 졌는지 알려주지 말라고했습니다. (-w) 누군가가 왜 물건이 고장 났는지 말해 줄 수 있겠습니까? ' – kfsone

+0

죄송합니다. 자습서에서 사용하도록 조언 한 명령이었습니다. "-w"를 제거하면 추가 오류가 발생하지 않습니다. – azurepancake

답변

2

함수 SDL_PollEvent는 SDL_event 객체의 주소가 전달되면 내부 이벤트 대기열에서 이벤트를 제거합니다.

대기열에서 종료 이벤트를 제거하는 이벤트 루프 앞에 printf 호출 또한 함수 SDL_PollEvent를 호출합니다.

printf("%d", SDL_PollEvent(NULL));