2010-08-10 8 views
1

Mon code n'a aucune erreur de compilation. Il semble avoir une erreur d'exécution. Dans le morceau de code suivant, lorsque la boucle while est exécutée pour la première fois, tout fonctionne correctement. Mais à la deuxième itération, tout s'arrête à "list :: itérateur k = (temp2-> store) .begin();". Quand je commente la partie "list :: iterator k ..." tout fonctionne bien. Les variables temp2 et temp2-> store ne sont pas NULL ou vides. Le débogueur a donné le message suivant "Exception non gérée à 0x009bc0cf dans le projet euler.exe: 0xC0000005: Emplacement de lecture de violation d'accès 0xddddddf5".Puis-je définir un itérateur dans une boucle while?

struct edge 
{ int end1, end2;  
    ptr_to_edge *ptr_end1, *ptr_end2; 
    edge *next, *l_chd, *r_chd; 
    edge(): next(NULL), l_chd(NULL), r_chd(NULL), ptr_end1(NULL), ptr_end2(NULL) 
    { } 
}; 


    struct ptr_to_edge { 
     int flag, vertex;  
     list<edge*> store; 
     ptr_to_edge(): flag(1) 
     { } 
    }; 
void parallel_reduction_step(ptr_to_edge *front, vector<edge> &a) { 

    list<edge*>::iterator next = (front->store).begin(); 
    next++; 
    list<edge*>::iterator current = (front->store).begin(); 
    list<edge*>::iterator last = (front->store).end(); 
    --last; 

    while(current!= last) { 

     if(((*current)->end1 == (*next)->end1)&&((*current)->end2==(*next)->end2)) { 

      edge temp1; 
      temp1.end1 = (*current)->end1; temp1.end2 = (*current)->end2; 
      a.push_back(temp1); 

      ptr_to_edge *temp2; 
      if ((*current)->end1==front->vertex) 
       temp2 = (*current)->ptr_end2; 
      else 
       temp2 = (*current)->ptr_end1; 

      list<edge*>::iterator k = (temp2->store).begin(); 

       current = (front->store).erase(j); 
      *current = &(a.back()); 
      } 
     else current++; 
     next++; 
     } 
    }; 
+0

Désolé. Je ne peux pas vous aider si je ne peux même pas lire votre message. –

+8

Le premier problème de votre code est que vous utilisez trop de variables à une lettre et que vous imbriqué trop de blocs. C'est entièrement illisible. Essayez d'utiliser des noms de variables sensibles et de diviser la fonction en composantes afin de faciliter la compréhension et la compréhension. –

+0

@ user416689: Quelle est la valeur de temp2 lors de cette deuxième traversée? Et quelle est la valeur de temp2-> store. Ma conjecture est que temp2 ou temp2-> store est NULL. –

Répondre

2

Merci d'avoir nettoyé le code. Il semble que vous poussiez des éléments sur le vecteur a puis que vous placiez des pointeurs sur ses éléments dans vos autres structures. Le problème avec ceci est que le redimensionnement de "a" (qui peut se produire lorsque vous l'ajoutez) provoquera l'invalidation des pointeurs (ou itérateurs) de ses éléments, ce qui peut se produire lorsque vous y insérez des éléments. Je ne sais pas si c'est le problème que vous avez avec le code, mais cela peut causer des problèmes. Vous pouvez remplacer "a" par "deque", ce qui n'invalidera pas les pointeurs vers ses éléments lorsque vous ajoutez à la fin, et il devrait corriger cette partie.

+0

J'ai renommé les itérateurs. Mais itérateur dernier (ou m de la poste non édité) n'est pas le problème .. – user416689

+0

je vais l'essayer et revenir vers vous dessus .. J'ai également inclus les définitions de structure si cela était de toute aide .. – user416689

+0

+ 1 'deque' devrait être le conteneur de facto! –

0

Plus de détails sur le message d'erreur que vous obtenez lorsque votre programme abandonne pourrait être utile, mais je vais faire une supposition sauvage de toute façon. Si vos valeurs temp2 et temp2->store ne sont pas NULL, alors peut-être que temp2->store est un conteneur vide? C'est-à-dire temp2->store.begin() == temp2->store.end(). Vous pourriez essayer de vérifier ce cas avant d'essayer de déréférencer k. Par exemple, vous pouvez changer votre boucle while pour

while(reached == 0 && k != temp2->store.end()) { 
    . 
    . 
    . 
} 

Si temp2->store est vide, BEGIN iterator est égale à la iterator fin et déréférencement le iterator final est mauvais. Donc, vous devriez avoir une vérification pour l'empêcher même si cela ne finit pas par être le problème.

+0

temp2-> le magasin n'est pas vide – user416689

+0

Est-il possible qu'il soit vide? Dans tout cas d'utilisation de votre code? Je mettrais toujours cette vérification là même si cela ne résout pas votre problème. Cela évitera probablement un autre problème un peu plus tard. –

+0

a ajouté la partie k! = Temp2-> store.end() à la condition while. mais le problème semble persister. – user416689

Questions connexes