ici est l'extrait de codeSoudain, pour une fonction spécifique d'un objet spécifique, obtenant pointeur NULL en C++
Obj *temp;
temp = new Sphere(center, radius);
struct color c = {1, 0, 0};
temp->setColor(c); //works fine
temp->setShine(1); //works fine
temp->setCoefficients(0.4, 0.2, 0.2, 0.2); //works fine
temp->draw(); //NULL pointer!!
objects.push_back(temp);
temp = new Floor(1000, 20);
temp->draw(); //works fine too!
objects.push_back(temp);
où Obj est une classe de base, Sphère et Ch sont dérivées classe, étirage est un procédé virtuel. Avant que ma fonction de tirage ne fonctionne parfaitement et qu'il n'y ait pas de problème de pointeur. Soudainement, j'obtiens cette erreur d'exc-bad-access et je débogue et découvre que de n'importe où j'appelle Sphere :: draw(), le pointeur "this" devient nul.
(je vais avoir du mal à coller la Sphère :: draw() fonctionnent correctement ici.)
glPushMatrix();
{
glColor3f(c.r, c.g, c.b);
glTranslatef(referencePoint.x, referencePoint.y, referencePoint.z);
printf("inside sphere draw\n");
double radius = length;
struct point points[1000][1000];
int stacks = 1000, slices = 1000;
int i,j;
double h,r;
//generate points
for(i=0;i<=stacks;i++)
{
h=radius*sin(((double)i/(double)stacks)*(pi/2));
r=radius*cos(((double)i/(double)stacks)*(pi/2));
for(j=0;j<=slices;j++)
{
points[i][j].x=r*cos(((double)j/(double)slices)*2*pi);
points[i][j].y=r*sin(((double)j/(double)slices)*2*pi);
points[i][j].z=h;
}
}
//draw quads using generated points
for(i=0;i<stacks;i++)
{
glColor3f(1.0, 0, 0);
//glColor3f((double)i/(double)stacks,(double)i/(double)stacks,(double)i/(double)stacks);
for(j=0;j<slices;j++)
{
glBegin(GL_QUADS);
{
//upper hemisphere
glVertex3f(points[i][j].x,points[i][j].y,points[i][j].z);
glVertex3f(points[i][j+1].x,points[i][j+1].y,points[i][j+1].z);
glVertex3f(points[i+1][j+1].x,points[i+1][j+1].y,points[i+1][j+1].z);
glVertex3f(points[i+1][j].x,points[i+1][j].y,points[i+1][j].z);
//lower hemisphere
glVertex3f(points[i][j].x,points[i][j].y,-points[i][j].z);
glVertex3f(points[i][j+1].x,points[i][j+1].y,-points[i][j+1].z);
glVertex3f(points[i+1][j+1].x,points[i+1][j+1].y,-points[i+1][j+1].z);
glVertex3f(points[i+1][j].x,points[i+1][j].y,-points[i+1][j].z);
}glEnd();
}
}
}glPopMatrix();
}
L'erreur réside dans les modifications que vous avez apportées à votre code. Définissez un point de contrôle sur temp dans votre débogueur. –
oui, en fait je l'ai trouvé il y a un moment. Merci beaucoup :) – khorgosh