«неверное значение» при вызове gluNewQuadric - PullRequest
0 голосов
/ 19 января 2019

Когда я запускаю этот код, консоль показывает «неверное значение» как ошибку.Я исследовал в своих книгах, но не нашел, как решить это.Они даже не упоминают, о чем эта ценность.Я предполагаю, что это будет номер адреса, сохраненный в указателе, возвращенном gluNewQuadric, который может быть вне диапазона типа GLUquadric, но не имеет возможности убедиться или исправить его

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>

#ifndef CALLBACK
#define CALLBACK
#endif

void CALLBACK erro(GLenum coderro)
{
    const GLubyte *estring;
    estring=gluErrorString(coderro);
    fprintf(stderr, "Erro de quadrica: %s\n", estring);
    exit(0);
}


void tela ()
{
    GLUquadric *quadrica;
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-30.0, 30.0, -30.0, 30.0, 1, 100);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslated(0.0, 0.0, -20.0);

    glColor3f(1.0, 0.0, 0.0);
    quadrica=gluNewQuadric();
    gluQuadricCallback(quadrica, GLU_ERROR, erro);
    gluQuadricDrawStyle(quadrica, GLU_FILL);
    gluDisk(quadrica, 0.0, 5.0, 1, 1);

    glFlush();
}

int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize(500, 500);
    glutCreateWindow("Tesselacao");
    glutDisplayFunc(tela);
    glutMainLoop();
}

Ответы [ 2 ]

0 голосов
/ 19 января 2019

См. Спецификацию gluDisk:

 void gluDisk(    GLUquadric* quad,
     GLdouble inner,
     GLdouble outer,
     GLint slices,
     GLint loops);

Параметры
[...]
slices Указывает количество подразделений вокруг оси z.

Это означает, что slices должно быть не менее 3, потому что для создания фигуры необходимо минимум 3 точки вокруг диска.

например.

gluDisk(quadrica, 0.0, 5.0, 3, 1); сгенерирует треугольник и
gluDisk(quadrica, 0.0, 5.0, 5, 1); создаст пятиугольник.

0 голосов
/ 19 января 2019

Если вы запустите это в отладчике и установите точку останова на erro, вы найдете что-то вроде этого (вывод из GDB):

Breakpoint 1, erro (coderro=100901) at test.c:12
12          estring=gluErrorString(coderro);
(gdb) bt
#0  erro (coderro=100901) at test.c:12
#1  0xf7dd7782 in gluQuadricError (qobj=0x81ddb70, which=100901) at src/libutil/quad.c:81
#2  0xf7dd85ad in gluPartialDisk (qobj=0x81ddb70, innerRadius=0, outerRadius=5, slices=1, loops=1, startAngle=0, sweepAngle=360) at src/libutil/quad.c:450
#3  0xf7dd84c8 in gluDisk (qobj=0x81ddb70, innerRadius=0, outerRadius=5, slices=1, loops=1) at src/libutil/quad.c:427
#4  0x08048af2 in tela () at test.c:36
#5  0xf7f72da8 in fghRedrawWindow () from /usr/lib/libglut.so.3
#6  0xf7f72df3 in fghcbDisplayWindow () from /usr/lib/libglut.so.3
#7  0xf7f77a90 in fgEnumWindows () from /usr/lib/libglut.so.3
#8  0xf7f72e47 in fghDisplayAll () from /usr/lib/libglut.so.3
#9  0xf7f73f39 in glutMainLoopEvent () from /usr/lib/libglut.so.3
#10 0xf7f73f97 in glutMainLoop () from /usr/lib/libglut.so.3
#11 0x08048b52 in main (argc=1, argv=0xffffd4e4) at test.c:48

Итак, ошибка исходит от gluDisk. Теперь простая попытка поиграть с его параметрами позволяет мне догадаться, что виновником является slices=1, что действительно не имеет смысла. Установка его, например, 2 избегает попадания в сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...