2016-08-26 21 views
0

私のプログラムを実行すると、このエラーが表示されますが、問題点を教えてください。それをどうやって修正することができますか?0x1000A456(glut32.dll)で例外がスローされるOpenGL

マイコード:

#include <windows.h> 
#include <gl/gl.h> 
#include <gl/glu.h> 
#include <gl/glut.h> 
#include <GLFW/glfw3.h> 
#include "Rect.h" 

const int rows = 40; 
const int cols = 20; 
const int length = rows * cols; 
int width = 905; 
int height = 720; 
Rect * list[length]; 

void createList() { 
    for (int i = 0; i < length; i++) { 
     list[i] = new Rect(); 
    } 
} 

void createQuad(int index) { 
    int wQuad = (width/20) - 5; 
    int hQuad = 12; 
    int margin = 5; 
    int marginTop = (index/20) * (hQuad + margin) + margin; 
    int marginLeft = (index % 20) * (wQuad + margin) + margin; 

    if (list[index]->getVisible()) { 
     glColor3ub(list[index]->getR(), list[index]->getG(), list[index]- >getB()); 
    } else { 
     glColor3ub(0, 0, 0); 
    } 

    glBegin(GL_QUADS); 
     glVertex2i(marginLeft  , marginTop  ); // A 
     glVertex2i(marginLeft + wQuad, marginTop  ); // B 
     glVertex2i(marginLeft + wQuad, marginTop + hQuad); // D 
     glVertex2i(marginLeft  , marginTop + hQuad); // C  
    glEnd(); 
} 

void display2(void) { 
    glClear(GL_COLOR_BUFFER_BIT); 

    for (int p = 0; p < length; p++) { 
     createQuad(p); 
    } 

    glutSwapBuffers(); 
} 

void init() { 
    glClearColor(0, 0, 0, 0); 
    glOrtho(0, 905, 720, 0, -0.5f, 0.5f); 
    glViewport(0, 0, 905, 720); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
} 

int CALLBACK WinMain(
    __in HINSTANCE hInstance, 
    __in HINSTANCE hPrevInstance, 
    __in LPSTR lpCmdLine, 
    __in int nCmdShow 
) { 
    GLFWwindow* window; 

    // Initialize the library 
    if (!glfwInit()) 
     return -1; 

    // Create the window 
    window = glfwCreateWindow(905, 720, "Color Game", NULL, NULL); 
    if (!window) { 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(window); 

    init(); 

    // Create list... 
    createList(); 
    char *myargv[1]; 
    int myargc = 1; 
    myargv[0] = strdup("ColorGame");  

    while (!glfwWindowShouldClose(window)) { 
     glutInit(&myargc, myargv); 
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
     glutInitWindowPosition(100, 100); 
     glutInitWindowSize(width, height); 
     glutDisplayFunc(display2); 
     // display2(); 
     // glutReshapeFunc(reshape); 
     glfwSwapBuffers(window); 

     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 
} 

Exception error

エラーは、この行である:私は置けば

glutDisplayFunc(display2); 

のみにてDisplay();作品が、私はglutDisplayFunc(display2)を配置する必要があります。なぜなら私はこの行でマウスイベントを処理する必要があるからです。glutMouseFunc(マウス);私がglutMouseFunc(マウス)を置いた場合;同じエラーが表示されます。

+0

、このような問題を解決するための適切なツールは、あなたのデバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

デバッガを使用しようとしましたが、 "glutDisplayFunc(display2);"という行が見つかりました。しかし、私はそれを解決する方法を知らない。 – Cava

+0

GLUT xまたはGLFWを使用してください。 [mcve]で編集します。 – genpfault

答えて

2

GLUT xまたはGLFWを使用してください。これらは両方とも、イベントループの単独の制御を必要とするアプリケーションフレームワークであり、同時に使用することはできません。 を1つと貼り付けてください。 GLUTを使って

例(Rectの実装を推測する必要がありました):

#include <GL/glut.h> 

const int rows = 40; 
const int cols = 20; 
const int length = rows * cols; 
int width = 905; 
int height = 720; 

class Rect 
{ 
public: 
    Rect() 
     : mVisible(rand() % 100 < 80) 
     , mR(rand() % 255) 
     , mG(rand() % 255) 
     , mB(rand() % 255) 
    { 
    } 

    bool getVisible() { return mVisible; } 
    unsigned char getR() { return mR; } 
    unsigned char getG() { return mG; } 
    unsigned char getB() { return mB; } 

private: 
    bool mVisible; 
    unsigned char mR; 
    unsigned char mG; 
    unsigned char mB; 
}; 

Rect* list[length]; 

void createList() 
{ 
    for (int i = 0; i < length; i++) 
    { 
     list[i] = new Rect(); 
    } 
} 

void createQuad(int index) 
{ 
    int wQuad = (width/20) - 5; 
    int hQuad = 12; 
    int margin = 5; 
    int marginTop = (index/20) * (hQuad + margin) + margin; 
    int marginLeft = (index % 20) * (wQuad + margin) + margin; 

    if(list[index]->getVisible()) 
    { 
     glColor3ub 
      (
      list[index]->getR(), 
      list[index]->getG(), 
      list[index]->getB() 
      ); 
    } 
    else 
    { 
     glColor3ub(0, 0, 0); 
    } 

    glBegin(GL_QUADS); 
    glVertex2i(marginLeft  , marginTop  ); // A 
    glVertex2i(marginLeft + wQuad, marginTop  ); // B 
    glVertex2i(marginLeft + wQuad, marginTop + hQuad); // D 
    glVertex2i(marginLeft  , marginTop + hQuad); // C  
    glEnd(); 
} 

void display2(void) 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 905, 720, 0, -0.5f, 0.5f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    for (int p = 0; p < length; p++) 
    { 
     createQuad(p); 
    } 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(width, height); 
    glutCreateWindow("ColorGame"); 
    createList(); 
    glutDisplayFunc(display2); 
    glutMainLoop(); 
    return 0; 
} 
+0

ありがとうございました! – Cava

0

glutとglfwが混在していますが、これは悪い考えです。オンラインの図書館の資料を読むべきです。あなたはループの外にこのコードを取る場合:

glutInit(&myargc, myargv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(width, height); 
    glutDisplayFunc(display2); 

は* GLFWを削除し、次の行を追加します。

glutMainLoop(); 

そして、それが動作するはずです。

+0

私はもう一度試しましたが、問題は続きます。 – Cava

関連する問題