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 :

Message d'erreur "list iterators incompatible" que je ne comprends pas


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut Message d'erreur "list iterators incompatible" que je ne comprends pas
    Bonsoir,

    J'ai un problème que j'ai réussi à reproduire avec le programme suivant :
    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
    37
    38
    #include <list>
    
    class CMyClass
    {
    public:
    	CMyClass(void) { }
    	~CMyClass(void) { }
    
    	void Add(void)
    	{
    			m_class_list.push_back(CMyClass());
    	}
    
    	// retourne une reference sur le dernier objet de la list
    	CMyClass & Last(void)
    	{
    		// juste pour être sûr d'avoir au moins un objet
    		if(m_class_list.size() == 0)
    			Add();
    
    		std::list<CMyClass>::iterator it = m_class_list.end();
    		--it;
    		return *it;
    	}
    
    	std::list<CMyClass> m_class_list;
    };
    
    int main(int argc, wchar_t* argv[])
    {
    
    CMyClass obj;
    CMyClass & last = obj;
    	last = obj.Last();
    
    	
    	return 0;
    }
    J'ai une erreur (debug assertion failed) que je ne comprends pas sur la partie en rouge.

    Si je remonte la pile, cela provient d'ici dans le fichier source de list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	bool operator==(const _Myiter& _Right) const
    		{	// test for iterator equality
     #if _ITERATOR_DEBUG_LEVEL == 2
    		if (this->_Getcont() == 0
    			|| this->_Getcont() != _Right._Getcont())
    			{	// report error
    			_DEBUG_ERROR("list iterators incompatible");
    			_SCL_SECURE_INVALID_ARGUMENT;
    			}
    et je ne comprends pas le message : "list iterators incompatible".

    Si quelqu'un sait m'expliquer ce que je fais mal ou alors peut être un bug dans l'implémentation de list de Microsoft (mais je n'y crois pas trop)

    J'utilise Visual studio 2012, le fichier source de "list" est c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\list

    Merci d'avance pour vos explications

    PS : heu ... dans la vrai vie, ma classe est un tout petit peu plus complexe que cela mais elle est récursive comme dans l'exemple fourni (je ne sais pas si récursive est le terme adéquat)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    last est une référence, tu ne peux que l'initialisé à la déclaration mais tu ne peux pas lui affecter de valeur après sa déclaration.

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Salut,

    C'est bizarre, avec vs2012 et le code donné je n'ai pas l'erreur et pourtant je vois bien le debuggeur qui passe dans la fonction bool operator==(const _Myiter& _Right) et qui teste le if(this->_Getcont etc.

    Par contre il y a truc qui me chiffonne :
    Citation Envoyé par ram-0000
    J'utilise Visual studio 2012, le fichier source de "list" est c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\list
    Avec vs2012 les header de la STL devraient pointer vers C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Avec vs2012 les header de la STL devraient pointer vers C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include
    J'ai dit 2012 ? En fait, c'est 2010, désolé pour l'erreur
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Neckara Voir le message
    last est une référence, tu ne peux que l'initialisé à la déclaration mais tu ne peux pas lui affecter de valeur après sa déclaration.
    J'avais un peu ce pré-sentiment mais je me disais innocemment que le compilateur ne me laisserais pas faire cela si je n'avais pas le droit.

    C'est vraiment interdit de "ré-affecter" une référence ? Parce qu'à aucun moment, cette référence ne pointe sur "rien", son contenu est toujours valide.

    Je viens de faire un autre test avec ceci :
    CMyClass obj("obj1");
    CMyClass obj2("obj2");
    CMyClass & last = obj;
    last = obj2;
    et je vois bien que last pointe vers un nouvel objet après la portion en rouge et sans erreur (visible).

    PS : j'ai modifié la classe CMyClass pour ajouter un paramètre dans le constructeur permettant d'identifier l'objet.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    J'avais un peu ce pré-sentiment mais je me disais innocemment que le compilateur ne me laisserais pas faire cela si je n'avais pas le droit.

    C'est vraiment interdit de "ré-affecter" une référence ? Parce qu'à aucun moment, cette référence ne pointe sur "rien", son contenu est toujours valide.
    Oui c'est illégal. Une référence est comme un "alias" d'une variable, il ne peut pointer que sur une seule variable durant tout son cycle de vie.

    EDIT : en fait tu dois appliquer l'opérateur= de l'objet pointé.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Neckara Voir le message
    EDIT : en fait tu dois appliquer l'opérateur= de l'objet pointé.
    Oui, tu as raison, à la suite de cette ré-affectation, le contenu de l'objet obj est égal à obj2.

    Je vais donc rectifier mon code pour ne plus faire de ré-affectation, c'est "le mal", c'est laid.

    Merci pour l'explication
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. Une erreur de "uninitialized value in concatenation" que je ne comprends pas.
    Par venturic dans le forum Programmation et administration système
    Réponses: 8
    Dernier message: 28/01/2011, 15h49
  2. Un message d'erreur que je ne comprends pas
    Par KOUTO dans le forum Bases de données
    Réponses: 7
    Dernier message: 22/01/2009, 17h25
  3. J'ai un message d'erreur que je ne comprend pas
    Par Jonathan Raucy dans le forum IHM
    Réponses: 2
    Dernier message: 24/09/2007, 17h14
  4. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37

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