2016-04-16 20 views
0

私のアプリケーションからGLFW keyCallbackにデータを送信しようとしていますが、そのデータにアクセスして変更します。しかし、私が渡すものは、アプリケーションのクラッシュなしにアクセスまたは変更することはできません。私は間違って何をしていますか?この行でGLFW keycallback userpointerにデータが渡されていません

//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 
} 
+0

GLFWはCライブラリです。コールバック関数は、少なくとも「extern」C ""として宣言する必要があります。 –

+0

コールバックが関数ポインタであるため、 'extern" C "'はこの場合に役立つ効果がありません。捕捉のないラムダ式でさえ送信することは可能です。同じ引数を受け入れる関数ポインタは、そのジョブを実行します。 –

答えて

1

:あなたはユーザポインタが現在窓構造ではなく、あなたの構造体を指すようになります、という設定

glfwSetWindowUserPointer(myWin, myWin); 

。コールバックが呼び出されると(それは後で呼ばれます)、デバッグ構造体を指しているのではなく、ウィンドウポインタを指しています。

ポインタを構造体に送信して、必要と思われる限り、そこに置く必要があります。コールバックが呼び出される前に、別のエラーを持っている

、デバッグ構造が破壊されています

{ 
    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... 
}; 
関連する問題