Как инициализировать перенасыщение с поддельными параметрами? - PullRequest
4 голосов
/ 20 января 2012

Я использую opengl, использую библиотеки GLUT и GLEW для создания плагина для определенного приложения.

Этот плагин не начинается с простого int main (argc, argv).Поэтому я не могу передать эти значения в glutInit ().

Я пробовал что-то вроде этого:

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

Но я потерпел крах, когда он попытался вызвать функцию glutInit ().Могу ли я каким-то образом восстановить эти параметры, чтобы он не потерпел крах и по-прежнему мог использовать библиотеку Glut .. ??

Ответы [ 4 ]

7 голосов
/ 20 января 2012

Вы можете сделать это так:

#include <GL/freeglut.h>

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

  glutInit( &fakeargc, fakeargv );

  //...
}

, но обратите внимание, что это уродливый хак.

4 голосов
/ 20 января 2012

Возможно, вам придется вызвать 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);
3 голосов
/ 20 января 2012

Обратите внимание на следующий код из источника (freeglut_init.c:677):

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

(Обратите внимание на разыменование.)

Кажется, что glutInit() требует минимума процессаимя, хотя справочная страница не проливает свет на это.

0 голосов
/ 16 апреля 2016

Я предлагаю это как стандарт де-факто для инициализации перенасыщенных приложений.

static inline void glutInstall()
{
    char *glut_argv[] = { 
        "", 
        (char *)0  
    };
    int glut_argc = 0; 

    glutInit(&my_argc, my_argv);
}

Эта функция может быть изменена для каждого отдельного приложения, чтобы обеспечить перенасыщение необходимыми аргументами (если они есть), одновременно решая вопрос о том, почему вы передаете аргументы командной строки сторонней библиотеке.

...