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

Langage C++ Discussion :

Probléme avec les conteneur


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Probléme avec les conteneur
    Bonjour à tous,

    je suis en première année d'informatique et j'ai probléme à un de mes TP. Le programme que je doit faire à pour but de trouver les chiffres dans une chaine de caractére et de les mettre dans un conteneur. Voici le code que je veux compiler :

    Code :
    #include <set>
    #include <iostream>

    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
    std::set<int> queLesChiffres(std::string & chaine )
    {
    std::set<int> ensChiffre;
    	unsigned int pos=0;
    	for ( pos=0 ; pos != chaine.size() ; pos++ )
    	{
    		if ( isdigit(chaine.at(pos)))
    		{
    			ensChiffre.insert(chaine.at(pos));
    		}
    	}
    	return ensChiffre;
    }
     
    void listerLesChiffres(std::set<int> & ens1)
    {
    	std::set<int>::const_iterator it;
    	for ( it = ens1.begin() ; it != ens1.end() ; it++ )
    	{
    		std::cout<<(*it)<<std::endl;
    	}
    	return;
    }
     
    void test()
    {
    	std::string chaineProg;
    	chaineProg+=("1Prog0ramma34tion3");
    	listerLesChiffres(queLesChiffres( chaineProg ));
    	return;
    }
    int main()
    {
    	test();
    	return 0;
    }
    et j'obtient les erreurs suivantes:

    -tp1.cpp: In function ‘void test()’:
    -tp1.cpp:32: error: invalid initialization of non-const reference of type ‘std::set<int, std::less<int>, std::allocator<int> >&’ from a temporary of type ‘std::set<int, std::less<int>, std::allocator<int> >’
    -tp1.cpp:18: error: in passing argument 1 of ‘void listerLesChiffres(std::set<int, std::less<int>, std::allocator<int> >&)’

    Je n'arrive vraiment pas à trouver la cause de ces erreurs ! Alors si quelqu'un peut m'aider je suis preneur !!

    Merci d'avance.

  2. #2
    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
    Oula...
    Tu es tombé sur un coin du C++ pas évident à expliquer, a foriori à un débutant.

    Pour corriger le problème, change :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void listerLesChiffres(std::set<int> & ens1)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void listerLesChiffres(std::set<int> ens1)
    Pour l'explication, je n'arrive pas à trouver un moyen simple de le formuler, faut que j'y réfléchisse

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ton aide Arzar , mon programme se compile très bien maintenant . Il a juste fallu que j'enlève 48 à mes nombres pour les lister avec leurs vrai valeurs .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void listerLesChiffres(std::set<int> ens1)
    {
    	std::set<int>::const_iterator it;
    	for ( it = ens1.begin() ; it != ens1.end() ; it++ )
    	{
    		std::cout<<((*it)-48)<<std::endl;
    	}
    	return;
    }
    Merci encore pour ton aide, je n'aurais jamais trouvé tous seul !

  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
    Pour l'explication, c'est parce que queLesChiffres renvoit un temporaire.
    Ensuite, tu passes ce temporaire en tant que référence à une autre fonction, ou, en d'autres mots, tu passes d'une r-value à une l-value ref, et c'est pas permis.

    Par contre, tu peux "récupérer" ce temporaire et rallonger sa durée de vie en prenant non pas une référence mais une référence constante.

    En effet, un const ref vers un temporaire rallonge la durée de vie de ce temporaire jusqu'à la fin de vie de la référence constante.

    Ton code devient donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void listerLesChiffres( const std::set<int> & ens1)
    {
       ...
    }

  5. #5
    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 Perudupinkop Voir le message
    Merci beaucoup pour ton aide Arzar , mon programme se compile très bien maintenant . Il a juste fallu que j'enlève 48 à mes nombres pour les lister avec leurs vrai valeurs .
    En réalité, pour que ça soit plus lisible, il vaudrait mieux que tu enlèves non pas 48, mais 'A'.

    C'est valable si tu reçois tes caractères en ASCII, pour le reste (UTF-16 et autres encodage à plus de 2 bytes) je suis pas sûr donc je m'avance pas.

  6. #6
    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
    salut.

    ton erreur vient du fait que la fonction listerLesChiffres prend une valeur par référence sur un retour par valeur ce qui est moyen.

    Il faut écrire à la place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [...]
    void listerLesChiffres(std::set<int> ens1)
    {
    }
    [...]
    ça peut peut-être passer avec une référence constante (const montype &) sinon, ou alors avec certaines options du compilateur.

    Si tu veux garder ta référence, copie le résultat de queleschiffres.

    Par contre, ta fonction ne marchera pas car elle ne donnera que le code des chiffres présent.

    Pour éviter ça, renseigne toi sur atoi() ou alors, fait du vrai C++ avec un istringstream.


    Bonne chance
    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++.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Copier des std::set ce n'est pas génial.
    Voici une petite optimization
    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
    std::set<int> & queLesChiffres(std::set<int> & ensChiffre, std::string const & chaine)
    {
    	unsigned int pos=0;
    	for ( pos=0 ; pos != chaine.size() ; ++pos )
    	{
    		if ( isdigit(chaine.at(pos)))
    		{
    			ensChiffre.insert(chaine.at(pos));
    		}
    	}
    	return ensChiffre;
    }
     
    void listerLesChiffres(std::set<int> const & ens1)
    {
    	std::set<int>::const_iterator it;
    	for ( it = ens1.begin() ; it != ens1.end() ; ++it )
    	{
    		std::cout<< ((*it)-'0') <<std::endl;
    	}
    	return;
    }
     
    void test()
    {
    	std::string chaineProg;
    	chaineProg+=("1Prog0ramma34tion3");
    	std::set<int> ensChiffre;
    	listerLesChiffres(queLesChiffres(ensChiffre, chaineProg ));
    	return;
    }
    Prendre aussi l'habitude de faire ++pos ou ++it au lieu de it++ et pos++ (c'est expliqué pourquoi quelque part dans les dédales de la FAQ ou des tutos).

Discussions similaires

  1. problème avec les conteneurs STL
    Par burak dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/04/2009, 17h43
  2. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  3. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  4. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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