GLFW 和 C 崩溃了

问题描述 投票:0回答:1

我在将 glfw 窗口创建拆分为两个函数(CreateWindow、CreateGameLoop)时遇到问题。我尝试了两种方法,但其中一种会导致窗口崩溃。 第一个示例的 main 中的 CreateGameLoop 为空。 第二个示例的 CreateWindow 中的 CreateGameLoop 为空。 有谁知道如何解决吗?

不工作:

#include <stdio.h>

#include <GLFW/glfw3.h>
#include <glad/glad.h>

void CreateGameLoop(GLFWwindow* window)
{
    while(!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();    
    }
    
    glfwTerminate();
}

void CreateWindow(GLFWwindow* window)
{
    glfwInit();
    window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
    if (!window)
    {
        printf("Failed to create GLFW window\n");
        glfwTerminate();
    }
    glfwMakeContextCurrent(window);
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        printf("Failed to initialize GLAD\n");
    }
}

int main()
{
    GLFWwindow* window;
    CreateWindow(window);
    CreateGameLoop(window);
    return 0;
}

工作中:

#include <stdio.h>

#include <GLFW/glfw3.h>
#include <glad/glad.h>

void CreateGameLoop(GLFWwindow* window)
{
    while(!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();    
    }
    
    glfwTerminate();
}

void CreateWindow(GLFWwindow* window)
{
    glfwInit();
    window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
    if (!window)
    {
        printf("Failed to create GLFW window\n");
        glfwTerminate();
    }
    glfwMakeContextCurrent(window);
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        printf("Failed to initialize GLAD\n");
    }
    
    CreateGameLoop(window);
}

int main()
{
    GLFWwindow* window;
    CreateWindow(window);
    return 0;
}
c glfw
1个回答
0
投票

调用

CreateWindow
函数后,你的窗口为NULL,尝试运行这个主函数:

int main()
{
 GLFWwindow* window;
 CreateWindow(window);

 if (window == NULL)
 printf("Window is NULL!\n");

 glfwDestroyWindow(window);
 glfwTerminate();
 return 0;
}

要解决此问题,只需对

CreateWindow
函数参数进行一些小修改即可:

来自:

void CreateWindow(GLFWwindow* window) {/*...*/}

至:

void CreateWindow(GLFWwindow** window) {/*...*/}

还将函数的内部引用从

window
更改为
*window
。这就是
CreateWindow
函数最后的样子:

void CreateWindow(GLFWwindow** window)
{
 glfwInit();

 *window = glfwCreateWindow(800, 600, "Game Window", 0, 0);
 if (!window)
 {
     printf("Failed to create GLFW window\n");
     glfwTerminate();
 }
 glfwMakeContextCurrent(*window);
 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
 {
     printf("Failed to initialize GLAD\n");
 }

}

如果您希望应用程序更具兼容性,请将这些行放在

glfwInit()
:

之后
 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

要在屏幕上绘图并避免将来出现问题,请设置视口大小:

 glViewport(0, 0, 800, 600);

说明:当您传递一个指针并希望在函数内创建它的值时,您需要将其作为“指针指针”传递。解决这个问题的另一种方法是让这个函数返回一个

GLFWwindow*
,而不是修改作为参数传递的一个。

© www.soinside.com 2019 - 2024. All rights reserved.