0
#include <gl/freeglut.h>

void Keyboard(int value){

    glutTimerFunc(33,Keyboard,0);
}

int main(int argc, char **argv){
   glutTimerFunc(33,Keyboard);
}

グローバル変数を使用せずに、メイン関数からキーボード関数にデータを渡す方法はありますか?関数glutTimerFuncは、非常に制限されているように見えるシグネチャ(int値)を持つ関数のみを許可しているようです。

4

2 に答える 2

2

では、データをグローバルにすることなく、データを別の機能に取り込む別の方法はありますか?

他の人がすでに提案したように:GLUTを使用しないでください。GLUTは、本格的なアプリケーションの基盤となることを意図したものではありませんでした。これは、小さなOpenGL技術デモ用の小さなフレームワークです。あなたが直面している問題は、CとC ++には「クロージャ」と呼ばれる、または「デリゲート」と呼ばれることもある概念が欠けていることです。他の言語にもそれらがあり、実際、それらの言語でGLUTバインディングを使用する場合、問題は発生しません。

C / C ++のクロージャの欠如は非常に目立つので、小さなライブラリ(内部的にはクレイジーですが天才的なことをします)が書かれているので、Cでクロージャを作成できます。これはffcallと呼ばれ、残念ながらメンテナンスされていないようですが、使用されていますGNUCommonLispおよびSchemeコンパイラとしてのプロジェクトによる。

StackOverflowの回答https://stackoverflow.com/a/8375672/524368およびhttps://stackoverflow.com/a/10207698/524368ですでにffcallの使用について書きました

于 2013-02-02T17:23:25.870 に答える
0

トリックを使用できます。オブジェクトをintにキャストした後、オブジェクトへのポインタを値として渡します。

i instance;
keyboard((int)&i);

タイマーを使用して関数を呼び出す必要がある場合は、関数が終了すると、スタック内のすべてのオブジェクトの割り当てが解除されることを考慮してください。したがって、この場合、オブジェクトをnewで割り当て、割り当てを解除する必要がある場合に備えて、常にオブジェクトへのハンドルを用意する必要があります。

それは非常にトリッキーです、私は知っています。別のライブラリに切り替えることができる場合は、それを行ってください。

于 2013-02-02T14:08:23.033 に答える