Pregunta

Estoy usando Dev-C ++ 4.9.9.2 (no preguntes por qué) y SDL 1.2.8.

A continuación, he creado un nuevo proyecto: SDL & amp; GL. Este proyecto ya contiene algún código:

#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);
}

A continuación, compilé el proyecto e intento ejecutarlo. Después de ejecutar el programa se muestra durante menos de 1 segundo y termina inmediatamente. El depurador devuelve el siguiente error: " Una infracción de acceso (falla de segmentación) provocada en su programa " ;.

Estoy usando Windows 2003 y Radeon x1950 PRO con los últimos controladores.

He probado el programa en una computadora portátil con Windows XP y funciona perfectamente. ¿Por qué este programa no funciona en mi computadora?

¿Fue útil?

Solución 3

Finalmente encontré algo de tiempo para resolver este problema. He desinstalado por completo los controladores gráficos de tarjetas antiguas e instalo los controladores ATI 9.8 con Catalyst Control Center. Ahora todo está funcionando.

Allí donde no hay problema en el código en sí. El problema era algo en mi sistema con controladores gráficos. De todos modos, gracias por sus respuestas!

Otros consejos

Funciona para mí también. Intentaría eliminar SDL_HWSURFACE y agregar SDL_DOUBLEBUF desde la llamada de la ventana.

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

mientras (! hecho) parece más bonito y más fácil de leer. Ya que está etiquetado con C ++, ¿por qué no estás usando bools para esto?

bool done = false;
while(!done){

También desea while (SDL_PollEvent (& amp; event)), ya que puede haber más de un evento por fotograma.

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

Mi conjetura es que se está estrellando en SDL_PollEvent (). Devuelve 1 / verdadero si hay un evento, 0 / falso si no es así. Cuando devuelve true, será un tipo determinado de SDL_Event basado en event.type. SDL_Event es una unión de todos los eventos SDL y no se garantiza que alguna información en un evento esté en el mismo orden, tipo, etc. que otro. Por lo tanto, solo necesita verificar el tipo de evento y manejarlo según sea necesario. Revise docs para más información, por supuesto. Algo como esto:

if (SDL_PollEvent(&event)) {
  switch (event.type) {
    case SDL_KEYUP:
      if (event.key.keysym.sym == SDLK_ESCAPE)
        done = 1;
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top