2009-10-23 6 views
0

J'utilise Dev-C++ 4.9.9.2 (ne demandez pas pourquoi) et SDL 1.2.8.Le programme SDL GL se termine immédiatement

Suivant J'ai créé un nouveau projet: SDL & GL. Ce projet contient déjà du code:

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

Ensuite, j'ai compilé le projet et essayé de l'exécuter. Après l'exécution, le programme affiche pendant moins de 1 seconde et se termine immédiatement. Débogueur renvoie l'erreur suivante: "Une violation d'accès (erreur de segmentation) soulevée dans votre programme". J'utilise Windows 2003 et Radeon x1950 PRO avec les derniers pilotes.

J'ai testé un programme sur un ordinateur portable avec Windows XP et cela fonctionne parfaitement. Pourquoi ce programme ne fonctionne pas sur mon ordinateur?

+1

Je le prends en vérifiant les retours d'erreur sur tous vos appels SDL et GL n'était pas instructif? – genpfault

+0

Oui, ce n'était pas informatif, car il renvoie l'erreur suivante: "Une violation d'accès (erreur de segmentation) soulevée dans votre programme". – GTD

Répondre

0

J'ai finalement trouvé du temps pour résoudre ce problème. J'ai complètement désinstallé les anciens pilotes graphiques de cartes et installé 9.8 pilotes ATI avec Catalyst Control Center. Maintenant tout fonctionne.

Là où pas de problème dans le code lui-même. Le problème était quelque chose dans mon système avec des pilotes graphiques. En tout cas merci pour vos réponses!

0

Je pense que c'est en train de planter sur SDL_PollEvent(). Il renvoie 1/true s'il y a un événement, 0/false sinon. Quand il renvoie true, il s'agira d'un certain type de SDL_Event basé sur event.type. SDL_Event est une union de tous les événements SDL et certaines informations dans un événement ne sont pas garanties dans le même ordre, le même type, etc. Donc, vous avez juste besoin de vérifier le type de l'événement et le gérer au besoin. Consultez le docs pour plus d'informations, bien sûr. Quelque chose comme ceci:

if (SDL_PollEvent(&event)) { 
    switch (event.type) { 
    case SDL_KEYUP: 
     if (event.key.keysym.sym == SDLK_ESCAPE) 
     done = 1; 
    } 
} 
+1

Cela ne serait pas _crash_. Il lira à partir de la mémoire non initialisée ou d'une valeur d'événement précédente, de sorte qu'il pourrait __quit__ prématurément. Bonne prise cependant! – Bahbar

2

Cela fonctionne pour moi aussi. J'essaierais de supprimer SDL_HWSURFACE et d'ajouter SDL_DOUBLEBUF à l'appel de la fenêtre.

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

alors que (! Done) semble plus joli et plus facile à lire. Comme il est marqué avec C++, pourquoi n'utilisez-vous pas bools pour cela?

bool done = false; 
while(!done){ 

Vous voulez également while (SDL_PollEvent (événement &)), comme il peut y avoir plus d'un événement par image.

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