2009-10-23 134 views
0

我使用的是Dev-C++ 4.9.9.2(不問爲什麼)和SDL 1.2.8。SDL GL程序立即終止

接下來我創建了一個新項目: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的筆記本電腦上的程序,它完美的作品。爲什麼這個程序在我的電腦上不起作用?

+1

我認爲它檢查所有您的SDL和GL調用的錯誤返回是不是信息? – genpfault 2009-10-23 16:26:38

+0

是的,它沒有提供信息,因爲它返回以下錯誤:「在程序中引發訪問衝突(分段錯誤)」。 – GTD 2009-10-26 11:48:32

回答

0

我終於找到了一些時間來解決這個問題。我完全卸載了舊卡圖形驅動程序,並在Catalyst Control Center中安裝了9.8 ATI驅動程序。現在一切正常。

那裏代碼本身沒有問題。問題是我的系統中有圖形驅動程序的問題。無論如何感謝您的答案!

0

我的猜測是它在SDL_PollEvent()上崩潰。如果有事件返回1/true,否則返回0/false。當它返回true時,它將成爲基於event.type的某種類型的SDL_Event。 SDL_Event是所有SDL事件的聯合,一個事件中的某些信息不能保證與另一個事件處於相同的順序,類型等。所以,你只需要檢查事件的類型並根據需要處理它。查看docs瞭解更多信息。就像這樣:

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

那不會_crash_。它將從未初始化的內存或以前的事件值中讀取,因此它可能過早地__quit__。雖然有好點子! – Bahbar 2009-10-28 08:25:14

2

它也適用於我。我試着從窗口調用中刪除SDL_HWSURFACE並添加SDL_DOUBLEBUF。

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

while(!done)看起來更漂亮,更易於閱讀。由於它是用C++標記的,爲什麼你不使用bools呢?

bool done = false; 
while(!done){ 

您還需要一段時間(SDL_PollEvent(&事件)),因爲可以有每幀以上的事件。

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