IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Itérateur n'arrivant pas à end()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Janvier 2007
    Messages : 29
    Par défaut Itérateur n'arrivant pas à end()
    Bonjour à tous.

    J'utilise un itérateur pour parcourir une liste (de la bibliothèque standard), avec une boucle for, de ce type
    for(p1 = maListe.begin();p1 != maListe.end();p1++)
    L'éxecutable plante (segmentation fault) en arrivant à cette boucle.
    J'ai découvert en fait que p1 ne prenait jamais la valeur maListe.end(), et c'est donc l'action ++ qui fait planter en lui demandant de pointer vers quelque chose qui n'existe pas, car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(p1 != maListe.end())
    {
    p1++;
    }
    plante également, tandis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i =0;
    std::list<Ma_Classe>::iterator p1;
    while(i<maListe.size())
    {
    i++;
    p1++;
    }
    Fonctionne.

    J'ai cherché sur Google, mais je n'ai pas trouvé de pages correspondant à mon problème.
    Si vous avez une piste, je suis preneur.
    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    Poste ton code, on ne pourra pas t'aider sans cela.

    L'erreur est sans doute dans la partie de ton code que tu ne mentionne pas parce que tu penses que c'est évident.

    Bonne journée.

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut fonction qui marche


    Comme il y a trop peu d info pour trouver ton problème, je te propose un code pour faire une recherche dans une list de ton type. Ce code est tres facilement adaptable a tes besoins je suppose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    bool MaClasse::ChercheDansListe(PARAM _CriterDeRecherche,MonTypeDeList::iterator &_MonIterateur)
    {
    	if (!m_MaListe.empty())
    	{				
    		_MonIterateur=m_MaListe.begin();//parcours de la liste
    		for(_MonIterateur;_MonIterateur!=m_MaListe.end();_MonIterateur++)
    		{			
    			if ((*_MonIterateur)->VerficationDuCritereDeRecherche()==_CriterDeRecherche)
    			{																
    				return true;
    			}			
    		}		
    	}	
    	_MonIterateur=m_MaListe.end();
    	return false;
    }
    Si la fonction retourne vrai, tu utilises l iterateur pour acceder au premier objet qui remplissait les condition de recherche.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Linschn n'a pas indiqué si c'était une recherche qu'il voulait faire. Enfin c'est une bonne piste, vu qu'habituellement ce sont les suppressions (mal faites) qui provoquent ce genre de comportement ; c'est d'ailleurs pour cela qu'on en parle dans la FAQ.

    Pour en revenir à la recherche, il y a std::find et std::find_if.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Janvier 2007
    Messages : 29
    Par défaut
    Merci de vos réponses,

    Tout d'abord, le code de la fonction telle qu'elle devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    bool EK_Maillage::noeudsLies(class EK_Noeud noeud1,class EK_Noeud noeud2)
    {
       std::list<class EK_Noeud_M>::iterator p1;
       std::list<class EK_Noeud>::iterator p2;
       for(p1 = me.begin();p1 != me.end();p1++)
         {
           printf("DEBUG:A,%i\n",me.size());
           if((*p1).getCoord()== noeud1)
     	{
     	  for(p2 = (*p1).getVoisinage().begin();p2 != (*p1).getVoisinage().end();p2++)
     	    {
     	      if((*p2) == noeud2)
     		{
     		  return true;
     		}
     	    }
     	  return false;
     	}
         }
    }
    En clair, on trouve noeud1 dans me, une fois qu'on l'a trouvé, on regarde si noeud 2 est dans la liste de ses voisins, et on renvoie la réponse.
    Voilà le code source de la fonction à l'heure actuelle, suivi de la sortie standard.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    bool EK_Maillage::noeudsLies(class EK_Noeud noeud1,class EK_Noeud noeud2)
    {
       std::list<class EK_Noeud_M>::iterator p1;
       std::list<class EK_Noeud>::iterator p2;
       for(p1 = me.begin();p1 != me.end();p1++)
         {
           printf("DEBUG:A,%i\n",me.size());
           if((*p1).getCoord()== noeud1)
     	{
    	  p2 = (*p1).getVoisinage().begin();
    	  int i;
    	  for(i = 0;i < (*p1).getVoisinage().size();i++)
    	    {
    	      printf("DEBUG:A1\n");
    	      p2++;
    	    }
    	  p2 = (*p1).getVoisinage().begin();
    	  while(p2 != (*p1).getVoisinage().end())
    	    {
    	      printf("DEBUG:A2\n");
    	      p2++;
    	    }
     	  printf("DEBUG:B%i\n",(*p1).getVoisinage().size());
     	  for(p2 = (*p1).getVoisinage().begin();p2 != (*p1).getVoisinage().end();p2++)
     	    {
     	      printf("DEBUG:C");
    // 	      if((*p2) == noeud2)
    // 		{
    // 		  return true;
    // 		}
     	    }
     	  return false;
     	}
         }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DEBUG:A,4
    DEBUG:A,4
    DEBUG:A1
    DEBUG:A2
    DEBUG:A2
    Erreur de segmentation (core dumped)
    Une seule occurence de DEBUG:A1 est normale, ma liste ne contient qu'un seul élément au début de l'algorithme.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca sent le retour par valeur pour getVoisinage().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Kylix 3] Je n'arrive pas à utiliser MySQL
    Par usebob dans le forum EDI
    Réponses: 4
    Dernier message: 15/04/2005, 10h18
  2. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21
  3. [Function] N'arrive pas à sortir
    Par bouboussjunior dans le forum ASP
    Réponses: 3
    Dernier message: 14/06/2004, 16h36
  4. Je n'arrive pas à détruire une fenêtre
    Par CORREGE Frédéric dans le forum MFC
    Réponses: 6
    Dernier message: 22/02/2004, 20h28
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo