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 :

Iterator bidirectional qui refuse les déréférencement ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut Iterator bidirectional qui refuse les déréférencement ?
    Bonjour

    en faisant des essais sur le conteneur set, je me suis retrouvé avec un énrome problème en testant la fonction upper_bound:

    en effet, la norme n'indique rien au sujet des recherches dont aucun membre ne serait pas dans le set.

    j'ai donc fait le programme de test 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
    #include <iostream>
    #include <set>
    void main()
    {
    	std::set<int> b;
     
    	std::set<int>::iterator c;
     
    	for (int i=0; i<100;++i){
    		std::cout<<i<<" ";
    		b.insert(i);
    	}
    	try
    	{
    		std::cout<<std::endl<<std::endl;
    		std::cout<<*b.upper_bound(50)<<std::endl;
    		c=b.upper_bound(100);
    		std::cout<<*c<<std::endl;//le programme plante ici.
     
    	}
    	catch (std::exception &e)
    	{
    		std::cout<<e.what();
    	}
     
     
    }
    Or sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<*c<<std::endl;
    le programme plante purement et simplement, c'est à dire qu'il refuse de déréférencer c alors que c'est censé être un itérateur bidirectional.

    De plus, il ne sort aucune exception ni quoi que ce soit dans le genre ...

    si vous avez une idée de la cause, je suis preneur.

    Cordialement
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    déjà, main c'est int et pas void.

    Ensuite, une fois ce problème réglé dans mon code (il compile pas autrement);
    chez moi, ton code s'execute complètement et donne le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
     
    51
    100
    La norme définit upper_bound comme le premier élément du set dont la valeur est supérieur à la clé, sinon end().

    Tu peux tester ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
    	{
    		std::cout<<std::endl<<std::endl;
    		std::cout<<*b.upper_bound(50)<<std::endl;
    		c=b.upper_bound(99);
    		assert( c == b.end() );
    		std::cout<<*c<<std::endl;// comportement indéterminé
     
    	}

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Apparement, ce n'est pas implémenté de la même manière dans visual studio.

    le débugger me dit qu'il est incapable d'évaluer a.

    Je vais le tester sur g++ pour voir.
    de plus, je me demande ce que signifie ton résultat : il calcule ++(*b.end())?

    en effet s'il renvoyait end(), tu devrais voir 99 et non 100...

    c'est vraiment étrange.

    cordialement.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    de plus, je me demande ce que signifie ton résultat : il calcule ++(*b.end())?
    Non, il ne calcule rien du tout. Déréférencer end() amène à un comportement indéterminé. Le fait que 100 soit 99+1 ne doit pas t'influencer.

    En l'occurance, chez moi, ça ressemble plus à la taille qu'à 99+1; mais rien de portable.

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    ha oui effectivement, je suis bête, j'ai confondu end et rbegin (qui pointe sur le dernier élément).

    bon, il faudra faire un test sur le résultat, c'est tout.

    enfin, j'aurais préféré la levée d'une exception, mais on peut pas tout avoir...


    merci beaucoup
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

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

Discussions similaires

  1. Onglet développeur qui refuse par tous les moyens de s'afficher
    Par barbicane dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/02/2015, 15h10
  2. Réponses: 1
    Dernier message: 22/11/2011, 09h37
  3. script qui explore les sous-répertoire ?
    Par farenheit dans le forum Flash
    Réponses: 9
    Dernier message: 20/07/2005, 12h02
  4. Marché de l'emploi qui pete les plomb
    Par Blo0d4x3 dans le forum Emploi
    Réponses: 27
    Dernier message: 07/03/2005, 11h25
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

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