Search code examples
c++csdlsdl-2

The correct way to test 'SDL_PollEvent' in a 'while'


As the manual says, the function SDL_PollEvent "Returns 1 if there is a pending event or 0 if there are none available." , that's why we use the test SDL_PollEvent(&e)!=0 (where e is a SDL_Event).

But, what about use this test: !SDL_PollEvent(&e)? It should work,but apparently it cause some problem.

Here an example of code:

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

    int main(int argc, char* args[]){
      SDL_Init(SDL_INIT_VIDEO);
      SDL_Window* window =   SDL_CreateWindow("Hello",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100,  SDL_WINDOW_SHOWN);
      SDL_Event e;
      int quit=0;
      while(!quit){
          //Here the test
          while (!SDL_PollEvent(&e)){
             if (e.type==SDL_QUIT)
                quit=1;
             else if ( e.type == SDL_KEYDOWN )
                printf( "Hello\n" );
          }
      }
      SDL_DestroyWindow(window);
      SDL_Quit();
      return 0;
   }

What this code should do is open a new window and print "Hello" in the console every time a key is pressed. This code works fine whit the test SDL_PollEvent(&e)!=0 but it doesn't read the SDL_KEYDOWN event when I use the test !SDL_PollEvent(&e) (but it DOES enter in the while and process the SDL_QUIT event without any problem).
Why this behaviour?


Solution

  • while (!SDL_PollEvent(&e))
    

    needs to be:

    while (SDL_PollEvent(&e))
    

    if it should be the same as SDL_PollEvent(&e) != 0

    because !SDL_PollEvent(&e) is the same as calling while(0)