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 :

Convertir un std::string en double.


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut Convertir un std::string en double.
    Bonjour, comment convertir un std::string en double? J'ai essayer avec un static_cast sans succès...


  2. #2
    Membre éprouvé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129

  3. #3
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Ca fonctionne pas mon truc


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    std::string Util::ToStr(const T & value) 
    {
        std::ostringstream oss;
        oss << value;
        return oss.str(); 
    }
    En faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*

    cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `double' in initialization

  4. #4
    Membre éprouvé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Par défaut
    essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <class T>
    bool Util::ToStr(std::string & str, const T & value) 
    {
        std::istringstream iss(str);
        return iss >> value != 0; 
    }
    En faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     double offset = Util::ToStr(dialog->GetOffset().mb_str()); // retourne un const char*
    toi, tu faisait un flux de sortie et non un flux d'entree!!!

  5. #5
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Je fais maintenant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double offset;
    Util::FromStrToAny(dialog->GetOffset().mb_str(), offset);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     template <class T>
     static bool FromStrToAny(const std::string&, T&)
     
     
    template<class T>
    bool FromStrToAny(const std::string & str, T & out )
    {
        // créer un flux à partir de la chaîne donnée
        std::istringstream iss( str );
     
        // tenter la conversion vers Dest
        return iss >> out != 0;
    }

    Et au linkage ca plante en me disant:

    [Linker error] undefined reference to `bool Util::FromStrToAny<double>(std::string const&, double&)'

  6. #6
    Membre éprouvé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Par défaut
    Citation Envoyé par vdumont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     template <class T>
     static bool FromStrToAny(const std::string&, T&)
    est-ce normal que le ";" de ta declaration n'y soit pas???

  7. #7
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Erreur de copier/coller désolé. Il y est.

  8. #8
    Membre éprouvé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Par défaut
    ca plante sur l'utilisation ou la partie declaration?implemantation???

  9. #9
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Ca plante sur le:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Util::FromStrToAny(dialog->GetOffset().mb_str(), offset);

  10. #10
    Membre éprouvé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Par défaut
    je ne me souviens plus trop donc, es-tu sur que la reference inclus dans la fonction ne gene pas l'appel ou tu passes une valeur?? il ne faudrait pas un pointeur par hasard ???

  11. #11
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  12. #12
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    oui, Laurent a raison...
    Mais tout de même, c'est énervant de devoir mettre tout dans le même fichier pour que le linker fasse son boulot...
    C'est vraiment le défault des template...

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ce n'est pas le linker qui a un problème, c'est le compilateur. Comment peut-il générer le code s'il ne sait pas qu'il doit le générer dans une autre unité de compilation ?

  14. #14
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    oui, au temps pour moi...

  15. #15
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Je comprend pas trop là... mes fonctions sont déjà tous dans un seul fichier .h donc je serais pas supposer avoir le problème ?!





    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
    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
     
    /* Auteur: Vincent Dumont
     * Printemps 2006
    */
     
    #ifndef util_h
    #define util_h
    #include <string>
    #include <sstream>
    #include <exception>
    /**************************
     *CLASSE ConversionFailure*
     *************************/ 
    class ConversionFailure: public std::exception
    {   
       public: 
         virtual const char* what() const throw() { return "Erreur: echec dans la conversion."; }    
    }; 
     
    /*************************
     *      CLASSE Util      *
     *************************/ 
    class Util 
    {
      public:
      Util();
      ~Util();
     
      template <class T>
      static std::string ToStr(const T &);                     // Convertir en string    
     
      template <class T>               
      static int ToInt(const T &) throw(ConversionFailure);    // Convertir en entier, peut lancer des exceptions en cas d'échec du >>
     
      template <class T>
      static bool FromStrToAny(const std::string&, T&)  throw(ConversionFailure); // Recoit un string et le converti en un type donné
    }; 
     
    /* *************************** * 
     *   IMPLEMENTATION DE Util    *
     * *************************** */
    template <class T>
    std::string Util::ToStr(const T & value) 
    {
        std::ostringstream oss;
        oss << value;
        return oss.str(); 
    }
     
    template <class T>
    int Util::ToInt(const T & value) throw(ConversionFailure)
    {
        std::istringstream iss(value);
        int integer;
        if (!(iss >> integer)) throw ConversionFailure();
     
        return integer;
    }
     
    template<class T>
    bool FromStrToAny(const std::string & str, T & out )
    {
        std::istringstream iss( str );
     
        // tenter output
        return iss >> out != 0;
    }
    #endif


    Je suis capable d'utiliser mes autres fonctions, ya seulement FromStrToAny qui plante au link...

  16. #16
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans l'implémentation, il n'y a pas les throw.
    Une indication : le fait d'indiquer que les fonctions peuvent renvoyer seulement un throw de type ConversionFailure fait que le compilateur ajoute un bloc try catch autours de ta fonction, et si elle renvoie un jour autre chose, c'est directement le programme qui se termine.
    En gros, les indications de throw sont à éviter.

  17. #17
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Dah en effet c'étais le throw qui pausait problème. Étant donné qu'il y avait le throw dans la déclaration mais pas dans l'implémentation.



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

Discussions similaires

  1. Convertir une std::string de utf8 vers cp850
    Par dj.motte dans le forum SL & STL
    Réponses: 7
    Dernier message: 30/10/2008, 22h15
  2. [FAQ]Comment convertir une std::string en AnsiString ?
    Par Invité dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/11/2006, 18h08
  3. Comment convertir une variable string en double?
    Par quentinoux dans le forum C++
    Réponses: 12
    Dernier message: 31/07/2006, 10h46
  4. convertir std::string en float
    Par radicalrider dans le forum SL & STL
    Réponses: 20
    Dernier message: 03/07/2006, 18h50
  5. convertir un char * en std::string
    Par benahpets dans le forum SL & STL
    Réponses: 12
    Dernier message: 01/05/2006, 17h15

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