2010-04-02 5 views
0

J'étudie STL et en projet win32 ..C++ STL vecteur iterator ... mais a une erreur d'exécution

Mais je me suis coincé dans l'erreur d'exécution ..

J'ai essayé de le déboguer, mais ..

(code partiel)

vector<Vertex> currPoly=polygons.back(); 
vector<Vertex>::iterator it; 


for(it=currPoly.begin();it!=currPoly.end();++it){ 
    vector<Vertex>::iterator p1; 
    vector<Vertex>::iterator n1; 
    vector<Vertex>::iterator n2; 

    if(  it==currPoly.begin()){ 
     p1=currPoly.end(); 
     n1=it+1; 
     n2=it+2; 
    }else if( it==currPoly.end()-1){ 
     p1=it-1; 
     n1=it+1; 
     n2=currPoly.begin(); 
    }else if( it==currPoly.end()){ 
     p1=it-1; 
     n1=currPoly.begin(); 
     n2=currPoly.begin()+1; 
    }else{ 
     p1=it-1; 
     n1=it+1; 
     n2=it+2; 
    } 
    int tmp; 
    tmp=it->x; 
    tmp=p1->x; 

s'il vous plaît click pour voir l'image de débogage

cela est très étrange parce que

dans le tableau de la montre,

n1, p1, il sont définis, mais ne sont pas n2 et tmp est pas non plus ..

Je ne trouve pas ce qui est faux ...

s'il vous plaît aider ..

+1

Jetez un coup d'œil aux autres questions C++ ici, puis faites en sorte que votre question leur ressemble. –

+0

Comme l'a dit Neil, postez votre code et l'erreur _exact_ que vous obtenez. –

+0

"La page que vous essayez d'afficher est privée." Je ne veux pas me connecter ou m'inscrire juste pour voir une photo 1 fois. – kennytm

Répondre

1

vous devriez être un peu plus clair sur exactement ce que votre question est ...

Si c'est que vous vous demandez pourquoi les valeurs pour n1 et tmp ne peut pas être affiché dans le débogueur, je devine que c'est parce que y Vous déboguez une build de version (ou une sorte de build avec des optimisations), et le compilateur a probablement "optimisé" ces variables à ce point dans le flux d'exécution (il a décidé qu'elles n'étaient plus utilisées ou leurs valeurs pouvaient être obtenues autre part). Essayez de déboguer une version non optimisée.Par ailleurs, l'erreur CXX0017 (qui est ce que le débogueur affiche pour ces variables) signifie, "Expression Evaluator Error".

+0

Merci beaucoup! J'ai compilé avec l'option de libération ... mon erreur .. – nzer0

0

Êtes-vous garanti un polygone toujours a au moins 3 points? Aussi, regardez de près votre premier si. Vous souvenez-vous que cette fin() est une fin après la fin? (Vous semblez la plupart du temps, mais il peut y avoir/sont des lieux où quelque chose va mal avec ça ...)

+0

Merci pour votre réponse. J'ai oublié que la fin() points derniers + 1 Je l'ai modifié mais toujours .. le programme a le même problème .. – nzer0

0

Comme une note:

}else if( it==currPoly.end()){ 
    p1=it-1; 
    n1=currPoly.begin(); 
    n2=currPoly.begin()+1; 
} 

Cela ne devrait jamais arriver.

int tmp; 
tmp=it->x; 
tmp=p1->x; 

Ceci semble un peu inutile à faire.

+0

Merci pour votre réponse. J'ai modifié le problème end(). et tmp était juste pour tester en mode de débogage. – nzer0

0

Vous avez toujours des problèmes avec l'idée que currPoly.end() ne pointe pas vers un élément valide. end() pointe à après le dernier élément valide. Parce que vous utilisez le vecteur comme un anneau, l'utilisation d'indices entiers dans le vecteur serait en fait un meilleur moyen d'écrire votre code. Vous pouvez modifier les indices en fonction de la taille du vecteur au lieu d'écrire un code de cas particulier. Mais puisque vous le faites pour apprendre le STL, nous resterons avec les itérateurs. Voici ce que je pense que le bon code devrait ressembler (je ne le compiler pour voir si cela fonctionne):

vector<Vertex> currPoly=polygons.back(); 
vector<Vertex>::iterator it; 


for(it=currPoly.begin();it!=currPoly.end();++it){ 
    vector<Vertex>::iterator p1; 
    vector<Vertex>::iterator n1; 
    vector<Vertex>::iterator n2; 

    if(it==currPoly.begin()){ 
     p1=currPoly.end()-1; 
     n1=it+1; 
     n2=it+2; 
    }else if(it==currPoly.end()-1){ 
     p1=it-1; 
     n1=currPoly.begin(); 
     n2=n1+1; 
    }else if(it==currPoly.end()-2){ 
     p1=it-1; 
     n1=it+1; 
     n2=currPoly.begin(); 
    }else{ 
     p1=it-1; 
     n1=it+1; 
     n2=it+2; 
    } 
    int tmp; 
    tmp=it->x; 
    tmp=p1->x; 
} 

Et voici ce que je pense que la version indicielle ressemblerait (encore une fois, n'a pas vérifier avec un compilateur):

vector<Vertex> currPoly=polygons.back(); 


for(int i=0; i < currPoly.size(); ++i){ 
    int p1 = (i+currPoly.size()-1)%currPoly.size(); 
    int n1 = (i+1)%currPoly.size(); 
    int n2 = (i+2)%currPoly.size(); 

    int tmp; 
    tmp=currPoly[i].x; 
    tmp=currPoly[p1].x; 
} 
+0

Merci pour votre réponse. Je ne savais pas que le vecteur a [] opérateur – nzer0