2017-05-24 4 views
0

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(); 

}

+0

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. –

+0

oui, en fait je l'ai trouvé il y a un moment. Merci beaucoup :) – khorgosh

Répondre

0

Le pointeur est pas réduit à néant, vous essayez juste d'écrire quelque chose au-delà de la limites de tableau. Ici:

for(i=0;i<=stacks;i++) 

ici:

for(j=0;j<=slices;j++) 

Le dernier élément de ce tableau est des points, et dans votre condition de boucle [piles-1] [tranches 1] vous essayez de vous référer aux points [ piles] [tranches] dans la dernière itération.

En outre, il y a un autre problème dans ces lignes:

ici:

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); 

et ici:

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); 

Les [i+1], [j+1] parties essaient de faire la même chose que ci-dessus la dernière itération.

+0

merci beaucoup. Je l'ai. Problème résolu – khorgosh

+0

De rien. Vous pouvez accepter cette réponse si vous pensez qu'elle a résolu votre problème. – KjMag