0

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 を搭載したラップトップでプログラムをテストしましたが、完全に動作します。このプログラムが私のコンピューターで動作しないのはなぜですか?

4

3 に答える 3

2

それは私にとってもうまくいきます。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;
}
于 2009-10-30T10:33:33.593 に答える
0

私はついにこの問題を解決する時間を見つけました。古いカード グラフィック ドライバを完全にアンインストールし、Catalyst Control Center で 9.8 ATI ドライバをインストールしました。今、すべてが機能しています。

コード自体に問題はありません。問題は、グラフィックドライバーを使用したシステムの何かでした。とにかく、あなたの答えに感謝します!

于 2009-11-05T12:45:01.103 に答える
0

私の推測では、SDL_PollEvent() でクラッシュしています。イベントがある場合は 1/true、そうでない場合は 0/false を返します。true を返す場合、event.type に基づく特定のタイプの SDL_Event になります。SDL_Event はすべての SDL イベントの結合であり、あるイベントの一部の情報は、別のイベントと同じ順序、型などであるとは限りません。したがって、イベントのタイプを確認し、必要に応じて処理する必要があります。もちろん、詳細についてはドキュメントを確認してください。このようなもの:

if (SDL_PollEvent(&event)) {
  switch (event.type) {
    case SDL_KEYUP:
      if (event.key.keysym.sym == SDLK_ESCAPE)
        done = 1;
  }
}
于 2009-10-27T23:50:20.143 に答える