GLFW keycallback 用户指针不携带数据

GLFW keycallback userpointer not carrying data

我正在尝试将数据从我的应用程序发送到 GLFW keyCallback,然后我在其中访问和修改该数据。但是,如果没有应用程序崩溃,我传递的任何内容都无法访问或更改。我做错了什么?

//main.cpp
typedef struct
{
    string type, name;
} DebugUsrPtr;

//hot loop
{
    DebugUsrPtr myPtr;
    myPtr.type = "aaa";
    myPtr.name = "bbb";
    void *testPtr = &myPtr;

    glfwSetWindowUserPointer(myWin, testPtr);
    glfwSetKeyCallback(myWin, keyCallback0);
    glfwSetWindowUserPointer(myWin, myWin);
}

//input.cpp
void keyCallback0(GLFWwindow *window, int key, int scancode, int action, int mods)
{
    auto *myTest = static_cast<DebugUsrPtr*>(glfwGetWindowUserPointer(window));
    cout << "name test = " << myTest->name << endl; // ""
    myTest->name = "zzzz"; //prints "zzzz" for one frame then appcrash
}

这一行:

glfwSetWindowUserPointer(myWin, myWin);

设置后,用户指针现在将指向 window 结构,而不是您的结构。所以callback在调用的时候(后面会调用),不再指向你的debug结构,而是指向windows指针

您需要将指针发送到您的结构,并在您认为需要时将其放在那里。

你有另一个错误,调试结构在调用回调之前被破坏:

{
    DebugUsrPtr myPtr;
    myPtr.type = "aaa";
    myPtr.name = "bbb";
    void *testPtr = &myPtr;

    glfwSetWindowUserPointer(myWin, testPtr);
    glfwSetKeyCallback(myWin, keyCallback0);
    glfwSetWindowUserPointer(myWin, myWin);
} // debug structure destroyed here!

所以当稍后调用回调时,调试结构将被释放,这将导致未定义的行为!

为此,我认为您应该在事件循环的父级范围内声明您的结构。就像这样:

DebugUsrPtr myPtr;
// ...
{
    glfwSetWindowUserPointer(myWin, &myPtr);
    glfwPollEvents(); // the callback will be called here if user press keys!
}

如果您真的在使用 C++,请改为这样声明您的结构:

struct DebugUsrPtr {
    std::string type, name;
};

如果你想为每个回调使用不同的类型或不同的指针,请将它们全部保存在一个更大的结构中:

struct AllPointers {
    DebugUsrPtr dbg;
    MouseUsrPtr mouse;
    // more...
};