【问题标题】:glfw - is a realloc inside key_callback possible?glfw - key_callback 内的 realloc 可能吗?
【发布时间】:2017-03-24 23:29:33
【问题描述】:

我正在尝试使用 glfw 在 openGL 中进行绘图,我面临的问题是要保存点的各种坐标(我无法知道它们的值或提前有多少)我需要重新分配指针以获得更多空间来保存它们。
我只需要在按下按钮时重新分配指针,因此我认为重新分配位于 key_callback 函数中是有意义的。
问题是,很明显,int *pointer 不在key_callback 的范围内,所以我不能直接在那里重新分配它,我不能将int * 传递给key_callback,因为它是一个glfw 函数我无法改变的具体论点。
我的问题是,我是否应该在 main (全局)之外声明 int *pointer = malloc 以便从 mainkey_callback 都可以看到它,在 key_callback 内增加一个全局变量并在 main 内执行类似 if (new_variable_value != old_variable_value){realloc} 的操作或存在我没有想到的第三种选择?

这是我现在拥有的代码的骨架:(很明显,由于很多原因它不起作用,只是为了让您了解我想要做什么)

key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) {
        // do stuff
        // realloc pointer
}

int main(void) {

    int *pointer = malloc(sizeof(int));
    if (!pointer){
        free(pointer);
        exit(EXIT_FAILURE);
    }

    GLFWwindow *window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(1280, 720, "Example", NULL, NULL);
    if (!window) {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);

    while (!glfwWindowShouldClose(window)) {

        //draw stuff

        glfwSwapBuffers(window);
        glfwPollEvents();

    }

    free(pointer);
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

【问题讨论】:

    标签: c opengl malloc glfw


    【解决方案1】:

    User pointer:

    每个窗口都有一个用户指针,可以使用glfwSetWindowUserPointer 设置并使用glfwGetWindowUserPointer 获取。这可以用于您需要的任何目的,并且在窗口的整个生命周期内都不会被 GLFW 修改。

    指针的初始值为NULL。

    【讨论】:

      【解决方案2】:

      pointer 声明为全局变量。这是最简单的解决方法。

      您需要在main() 中使用malloc() 初始化指针——在全局范围内声明的变量只能初始化为常量值,不能初始化函数调用。

      【讨论】:

      • 好吧,我现在感觉很愚蠢,我从不使用全局变量,所以我不知何故忘记了它们不能被初始化为函数调用......
      猜你喜欢
      • 2018-03-23
      • 2011-04-20
      • 2018-03-09
      • 2014-07-18
      • 2011-11-20
      • 2018-06-03
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多