X请求失败的错误:BadValue(整数参数超出操作范围)

时间:2016-05-02 10:05:26

标签: c++ sdl-2

也许这只是我的愚蠢,但我相信这应该有用。

#include <SDL2/SDL.h>
#include <GL/glew.h>

struct Display
{
  SDL_Window*   window;
  SDL_GLContext context;
};

Display* init()
{
  SDL_Init( SDL_INIT_EVERYTHING );

  SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
  SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
  SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK , SDL_GL_CONTEXT_PROFILE_CORE );

  SDL_Window* window = SDL_CreateWindow( "Ice Engine",
                                         800, 600,
                                         SDL_WINDOWPOS_CENTERED,
                                         SDL_WINDOWPOS_CENTERED,
                                         SDL_WINDOW_OPENGL );
  if ( !window )
  {
    printf( "%s\n", SDL_GetError() );
    return nullptr;
  }

  SDL_GLContext context = SDL_GL_CreateContext( window );

  if ( !context )
  {
    printf( "%s\n", SDL_GetError() );
    return nullptr;
  }

  glewExperimental = GL_TRUE;
  if ( glewInit() != GLEW_OK )
    return nullptr;

  return new Display{ window, context };
}

int main( int argc, char** argv )
{
  Display* display = init();

  bool running = true;
  SDL_Event e;

  while( running )
  {
    while( SDL_PollEvent( &e ) )
      if ( e.type == SDL_QUIT )
        running = false;

    SDL_GL_SwapWindow( display->window );
  }

  delete display;
  SDL_Quit();
}

我可能不应该使用new和delete等,但这只是一个快速设置来让我的项目继续进行。问题是它编译得很好,但是当我运行它时我得到了这个错误:

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  1 (X_CreateWindow)
  Value in failed request:  0x0
  Serial number of failed request:  155
  Current serial number in output stream:  168

我试过没有设置OpenGL上下文版本,但我得到了同样的错误。

我尝试切换到GLFW3,一切正常。它创建了一个窗口和一个OpenGL 3.3核心配置文件上下文。所以它似乎是SDL2的一个问题。我正在运行ubuntu 15.10,我通过命令行安装了它:sudo apt install libsdl2-dev

1 个答案:

答案 0 :(得分:2)

您正在正确呼叫SDL_CreateWindow。您混合了x,y和宽度,高度设置。正确的方法是:

SDL_Window* window = SDL_CreateWindow("Ice Engine",
                                      SDL_WINDOWPOS_CENTERED,
                                      SDL_WINDOWPOS_CENTERED,
                                      800, 
                                      600,
                                      SDL_WINDOW_OPENGL );

SDL_CreateWindow reference。除此之外,您的代码看起来很好。