Программа SDL GL немедленно завершается

Я использую Dev-C++ 4.9.9.2 (не спрашивайте почему) и SDL 1.2.8.

Затем я создал новый проект: SDL&GL. Этот проект уже содержит некоторый код:

#include <SDL/SDL.h>
#include <gl/gl.h>

int main(int argc, char *argv[]){
    SDL_Event event;
    float theta = 0.0f;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);

    glViewport(0, 0, 600, 300);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_PROJECTION);
    glMatrixMode(GL_MODELVIEW);

    int done;
    for(done = 0; !done;){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glLoadIdentity();
        glTranslatef(0.0f,0.0f,0.0f);
        glRotatef(theta, 0.0f, 0.0f, 1.0f);

        glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(0.0f, 1.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex2f(0.87f, -0.5f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex2f(-0.87f, -0.5f);
        glEnd();

        theta += .5f;
        SDL_GL_SwapBuffers();
        SDL_PollEvent(&event);
        if(event.key.keysym.sym == SDLK_ESCAPE)
            done = 1;
    }
    SDL_Quit();
    return(0);
}

Затем я скомпилировал проект и попытался его запустить. После запуска программа отображается менее 1 секунды и сразу же завершается. Отладчик возвращает следующую ошибку: «В вашей программе возникло нарушение прав доступа (ошибка сегментации)».

Я использую Windows 2003 и Radeon x1950 PRO с последними драйверами.

Я протестировал программу на ноутбуке с Windows XP, и она отлично работает. Почему эта программа не работает на моем компьютере?


person GTD    schedule 23.10.2009    source источник
comment
Я так понимаю, проверка возврата ошибок на всех ваших вызовах SDL и GL не была информативной?   -  person genpfault    schedule 23.10.2009
comment
Да, это не было информативно, потому что возвращало следующую ошибку: В вашей программе возникло нарушение прав доступа (ошибка сегментации).   -  person GTD    schedule 26.10.2009


Ответы (3)


Это работает и для меня. Я бы попробовал удалить SDL_HWSURFACE и добавить SDL_DOUBLEBUF из вызова окна.

SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_NOFRAME | SDL_DOUBLEBUF);

while(!done) выглядит красивее и легче читается. Поскольку он помечен C++, почему вы не используете для этого логические значения?

bool done = false;
while(!done){

Вы также хотите использовать while(SDL_PollEvent(&event)), так как в каждом кадре может быть более одного события.

while(SDL_PollEvent(&event))
{
    switch(event.type)
        case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_ESCAPE)
                done = true;
}
person pbos    schedule 30.10.2009

Я предполагаю, что он падает на SDL_PollEvent(). Возвращает 1/true, если событие есть, и 0/false, если нет. Когда он вернет true, это будет определенный тип SDL_Event на основе event.type. SDL_Event — это объединение всех событий SDL, и не гарантируется, что некоторая информация в одном событии будет в том же порядке, типе и т. д., что и в другом. Итак, вам просто нужно проверить тип события и обработать его по мере необходимости. ">docs для получения дополнительной информации, конечно. Что-то вроде этого:

if (SDL_PollEvent(&event)) {
  switch (event.type) {
    case SDL_KEYUP:
      if (event.key.keysym.sym == SDLK_ESCAPE)
        done = 1;
  }
}
person RayOK    schedule 27.10.2009
comment
Это не приведет к падению. Он будет считываться из неинициализированной памяти или предыдущего значения события, поэтому может выйти преждевременно. Хороший улов однако! - person Bahbar; 28.10.2009

Наконец-то я нашел время, чтобы решить эту проблему. Я полностью удалил старые графические драйверы карт и установил драйверы ATI 9.8 с помощью Catalyst Control Center. Теперь все работает.

Там, где нет проблем в самом коде. Проблема была в моей системе с графическими драйверами. В любом случае спасибо за ваши ответы!

person GTD    schedule 05.11.2009