Domanda

Sto usando Dev-C ++ 4.9.9.2 (non chiedere perché) e SDL 1.2.8.

Successivamente ho creato un nuovo progetto: SDL & amp; GL. Questo progetto contiene già del codice:

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

Successivamente ho compilato il progetto e ho provato a eseguirlo. Dopo l'esecuzione il programma mostra per meno di 1 secondo e termina immediatamente. Il debugger restituisce il seguente errore: " Una violazione di accesso (errore di segmentazione) sollevata nel programma " ;.

Sto usando Windows 2003 e Radeon x1950 PRO con i driver più recenti.

Ho testato il programma su laptop con Windows XP e funziona perfettamente. Perché questo programma non funziona sul mio computer?

È stato utile?

Soluzione 3

Ho finalmente trovato del tempo per risolvere questo problema. Ho disinstallato completamente i driver della scheda grafica vecchia e ho installato i driver ATI 9.8 con Catalyst Control Center. Ora funziona tutto.

Là dove nessun problema nel codice stesso. Il problema era qualcosa nel mio sistema con driver grafici. Comunque grazie per le tue risposte!

Altri suggerimenti

Funziona anche per me. Proverei a rimuovere SDL_HWSURFACE e aggiungere SDL_DOUBLEBUF dalla finestra.

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

while (! done) sembra più bello e più facile da leggere. Dato che è taggato con C ++, perché non usi bool per questo?

bool done = false;
while(!done){

Si desidera anche while (SDL_PollEvent (& amp; event)), poiché può esserci più di un evento per frame.

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

La mia ipotesi è che si sta bloccando su SDL_PollEvent (). Restituisce 1 / true se esiste un evento, 0 / false in caso contrario. Quando restituisce true, sarà un determinato tipo di SDL_Event basato su event.type. SDL_Event è un'unione di tutti gli eventi SDL e alcune informazioni in un evento non sono garantite nello stesso ordine, tipo, ecc. Di un altro. Quindi, devi solo controllare il tipo di evento e gestirlo come necessario .. Dai un'occhiata a documenti per maggiori informazioni ovviamente. Qualcosa del genere:

if (SDL_PollEvent(&event)) {
  switch (event.type) {
    case SDL_KEYUP:
      if (event.key.keysym.sym == SDLK_ESCAPE)
        done = 1;
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top