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

SL & STL C++ Discussion :

Implémentation STL de MS VC++2005


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut Implémentation STL de MS VC++2005
    Bonjour,
    Je suis passé de VS2003 à VS2005 et j'ai noté le problème suivant : il semble que de nombreuses choses ont changé dans l'implémentation de la STL.
    Depuis la nouvelle version, il n'est plus possible de comparer (pour l'égalité) des itérateurs de liste correspondant à des containers différents.
    En effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #if _HAS_ITERATOR_DEBUGGING
    		void _Compat(const _Myt_iter& _Right) const
    			{	// test for compatible iterator pair
    			if (this->_Mycont == 0 || this->_Mycont != _Right._Mycont)
    				{
    				_DEBUG_ERROR("list iterators incompatible");
    				_SCL_SECURE_TRAITS_INVALID_ARGUMENT;
    				}
    			}
    En effet, il vérifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->_Mycont != _Right._Mycont
    Je cherche une façon de contourner celà facilement.

    La raison est que j'ai une classe type conteneur , qui utilise la liste de la stl. (c'est un pool d'objet avec une stratégie d'allocation.)
    Les iterateurs de ce conteneur sont implémentés à partir d'un itérateur de liste. Je reproduit le concepte de "pointeur NULL" avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const static iterator DUMMY
    (défini dans la class d'itérateur, idem pour le const_iterator). Ces valeurs statiques sont initialisées à partir d'une instance statique vide du conteneur avec begin().
    Avec cette nouvelle implémentation de la stl, je ne peux plus comparer mes iterator avec iterator::DUMMY ou mes const_iterator avec const_iterator::DUMMY .

    Une idée ?
    S.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La première option qui me vient à l'esprit, c'est ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //En tête de source, avant les includes
    #define _HAS_ITERATOR_DEBUGGING 0
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Et si tu les initialise avec le constructeur pas défaut de l'itérateur ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut
    Non, ils sont statiques et donc initialisés indépendamment.
    S.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je n'ai pas compris ta réponse. Si ils sont initialisés avec le constructeur par défaut des itérateurs, sont-ils comparables sans problème avec des itérateurs venant de n'importe où (peut-être ce cas spécial est-il géré par la STL Microsoft)?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut JolyLoic
    Les itérator et const_iterator "DUMMY" sont des variables membres const et static des classes iterator et const_iterator, donc initialisées indépendamment de tout constructeur car ils sont indépendants de l'instance de la classe.
    Ils sont initialisés avant même l'exécution de main()
    Le problème que j'ai avec la STL implémentée par MS, c'est qu'ils n'autorisent pas la comparaison par "==" et "!=" d'itérateurs de liste de même type si ils correspondent à des listes différentes. En effet, dans leur implémentation, l'itérateur possède un pointeur vers son container et si ces conteneurs sont différents, la comparaison lance une exception.
    Il semble que ce probleme soit résolu en définissant due variables d'environnement à 0. (Je poste la solution tout à l'heure.) Ils semble que ce type d'implémentation soit standard.
    en effet :
    http://std.dkuug.dk/jtc1/sc22/wg21/d...1997/N1075.pdf voir le début de la page 2, écrite par le grand gourou du c++ .
    Je vais donc devoir faire une implémentation qui respecte ce cas sans passer par une solution sale type variable d'environnement.
    S.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/04/2006, 10h58
  2. [Kylix] [BCB] pb avec la STL
    Par pykoon dans le forum EDI
    Réponses: 1
    Dernier message: 29/12/2002, 12h56
  3. Réponses: 2
    Dernier message: 06/07/2002, 12h36
  4. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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