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,不幸的是似乎没有维护,但正在使用中通过项目作为 GNU Common Lisp 和 Scheme 编译器。

我已经在 StackOverflow 的答案https://stackoverflow.com/a/8375672/524368https://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 回答