понимание этого кода OpenGL - PullRequest
0 голосов
/ 03 октября 2010

Я программист на Java, изучаю opengl на C впервые. Я хочу разобрать этот простой код, который дал мне мой инструктор без особых объяснений:

void renderScene (void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
        glVertex3f(-0.5,-0.5,0.0);
        glVertex3f(0.5,0.0,0.0);
        glVertex3f(0.0,0.5,0.0);
    glEnd();
    glFlush();


   void init(); {
       int submenu;
       submenu = glutCreateMenu(menuApp);
       glutAddMenuEntry("Option A",1);
       glutAddMenuEntry("Option B",2);
       glutAddMenuEntry("Option C",3);

       glutCreateMenu(menuApp);
       glutAddSubMenu("SubMenu",submenu);
       glutAddMenuEntry("Salir",4);

       glutAttachMenu(GLUT_RIGHT_BUTTON);


   }

}

Вопросы:

а) Что означает void renderScene (void)? Почему эта функция должна принимать параметр void?

б) Что, черт возьми, это void init(); {}? Почему оба; а также {}? Почему внутри функции renderScene?

Ответы [ 4 ]

2 голосов
/ 03 октября 2010

void renderScene (void) - это способ С сказать "объявить renderScene как функцию, не имеющую аргументов и не возвращающую значение" . void renderScene() было бы чем-то другим - это устаревший стиль объявления функции в C, декларирующий, что renderScene принимает фиксированное, но неопределенное количество параметров.

Другая часть немного странная и отформатирована обманчиво. Отформатированный правильно, он будет читать:

void init();

{
     int submenu;
     submenu = glutCreateMenu(menuApp);
     glutAddMenuEntry("Option A",1);
     /* ... */
}

Блок внутри { } не связан с void init();. void init(); объявляет функцию с именем init (это упомянутый выше устаревший стиль объявления функции). Объявление функции - это просто способ сказать компилятору «где-то есть функция, которая называется this, и это ее аргументы и возвращаемое значение». Поскольку функция init никогда не вызывается, эта строка может быть опущена.

Блок внутри { } является просто составным оператором. Все, что он делает, это открывает новую область видимости - переменная submenu имеет область видимости, ограниченную этим блоком.


Также стоит отметить, что объявление void init(); само по себе является анахронизмом - это объявление, которое появляется после кода в том же блоке, что является функцией, добавленной в пересмотре стандарта C на 1999 год, но это объявление без прототип, который, как уже упоминалось, предшествует первоначальному стандарту 1989 г. С.

Также обратите внимание, что объявления функций, которые не находятся в области видимости файла, сами по себе несколько необычны, хотя и абсолютно законны.

1 голос
/ 03 октября 2010

void renderScene (void) означает, что функция не принимает аргументов.

Это похоже на void renderScene () в Java.

Что, черт возьми, пустота init (); {}?

Вероятно, опечатка; не должно быть там.

Почему это внутри функции renderScene?

Возможно, еще одна опечатка, у renderScene должна быть другая}

1 голос
/ 03 октября 2010

Функция renderScene, имеющая параметр void, означает, что она не принимает никаких параметров.

Функция init запускает программу. Другими словами, он запускается и готовится что-то сделать.

Должна быть определена функция init

void init(){
...

}

вместо

void init();{
...
}

и НЕ ДОЛЖНО находиться в пределах renderScene.

0 голосов
/ 03 октября 2010

Если отправленный вами фрагмент кода верен, это определение функции renderScene. Функция не возвращает значение и не принимает никаких параметров.

void init(); является декларацией. Он просто позволяет компилятору узнать подробности функции с именем init, чтобы он мог генерировать правильный код, когда мы его вызываем, - но это неполное объявление (не очень помогает компилятору), и он не вызывается везде, где это объявление в рамках. Так что это просто шум.

Если мы проигнорируем это и продолжим с {, следующие строки - это группа операторов, инициированных, вероятно, для введения переменной submenu, которая живет только внутри этого нового блока.

...