如何用假参数初始化过剩?

时间:2012-01-20 12:04:47

标签: c++ opengl glut glew

我使用opengl,使用GLUT和GLEW库为特定应用程序创建插件。

这个插件并不是以一个简单的int main(argc,argv)开头的。所以我无法将这些值传递给glutInit()。

我试过这样的事情:

glutInit(0, NULL); <--- Crash
GLenum err = glewInit();

但是当我试图调用glutInit()函数时我崩溃了。我可以重建那些参数,以便它不会崩溃并且仍然可以使用Glut库.. ??

4 个答案:

答案 0 :(得分:7)

你可以这样做:

#include <GL/freeglut.h>

int main()
{
  char fakeParam[] = "fake";
  char *fakeargv[] = { fakeParam, NULL };
  int fakeargc = 1;

  glutInit( &fakeargc, fakeargv );

  //...
}

但请注意,这是一个丑陋的黑客。

答案 1 :(得分:4)

您可能需要使用有效的glutInit参数致电argv,即使您没有参数:

char *my_argv[] = { "myprogram", NULL };
int   my_argc = 1;
glutInit(&my_argc, my_argv);

修改

也可能是第一个参数是指向int的指针,它不能为NULL?那么仅传递有效的argc参数就足够了:

int my_argc = 0;
glutInit(&my_argc, NULL);

答案 2 :(得分:3)

请注意来自源代码(freeglut_init.c:677)的以下代码:

void FGAPIENTRY glutInit( int* pargc, char** argv )
{
    char* displayName = NULL;
    char* geometry = NULL;
    int i, j, argc = *pargc;
    ...

(注意解除引用。)

似乎glutInit()确实需要最少的进程名称,尽管手册页并未对此有所了解。

答案 3 :(得分:0)

我认为这是初始化过剩申请的事实标准。

For Each slice In slices
    graph.drawSlice slice
Next

可以在每个应用程序的基础上修改此函数,以提供所需的参数(如果有的话),同时永久解决每个人的问题,询问为什么要将命令行参数传递给第三方库。