Исключение, выданное при 0x00000000 в Project0_opengl.exe : 0xC0000005: место выполнения с нарушением доступа 0x00000000

#c #opengl

#c #opengl

Вопрос:

Я пишу правильный код, но компилятор выдает ошибку. В ошибке указано, что ошибка включена glGenBuffers но я скопировал ее с официального сайта. В чем моя ошибка?

 #include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <stdio.h>

int main(void)
{
    GLFWwindow* window;
    glewExperimental = GL_TRUE;

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

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    float pos[6] = {
        -0.5f, -0.5f,
         0.0f,  0.5f,
         0.5f, -0.5f
    };

    GLuint buf;
    glGenBuffers(1, amp;buf);
    glBindBuffer(GL_ARRAY_BUFFER, buf);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);

    if (glewInit() != GLEW_OK)
        printf("Errorn");

    printf("%s", glGetString(GL_VERSION));

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}
  

Комментарии:

1. «Я пишу правильный код, но компилятор выдает ошибку» — Эх, нет . Если компилятор выдает ошибку, то вы, скорее всего, не пишете «правильный код».

2. int main(void) правильный C, но в C void является избыточным.

3. return -1; — возврат отрицательных значений из main обычно является ошибкой. В большинстве случаев это не приведет к тому, чего вы ожидаете. Предпочитаю возвращать EXIT_FAILURE или EXIT_SUCCESS в зависимости от обстоятельств.

4. Спасибо! Это действительно помогло.

Ответ №1:

glewInit() должно быть вызвано после того, как контекст OpenGL станет текущим, после glfwMakeContextCurrent .
Но оно должно вызываться перед любой инструкцией OpenGL. Смотрите также Инициализацию GLEW:

 // [...]

/* Make the window's context current */
glfwMakeContextCurrent(window);

glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
    printf("Errorn");

float pos[6] = {
    -0.5f, -0.5f,
     0.0f,  0.5f,
     0.5f, -0.5f
};

GLuint buf;
glGenBuffers(1, amp;buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);

// [...]
  

Обратите внимание, что инструкции, подобные glGenBuffers , являются указателями на функции. Эти указатели инициализируются на NULL . glewInit() присваивает адрес функции этим указателям.
При попытке вызвать функцию перед инициализацией это вызывает:

Место выполнения с нарушением доступа 0x00000000