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 :

convertir char en enum


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut convertir char en enum
    Bonjour,

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    enum AA {A, R, N, D, C, Q, E, G, H, I, L, K, M, F, P, S, T, W, Y, V, B, Z, X, GO, GE, GT};
    residus=new AA[total_res];
     
    for(int i=0; i<nb_seq;i++){
    	cout<<"longueur seq "<<name_seq[i]<<" : "<<length_seq[i]<<endl;
    	string test=res_by_seq[i];
    	for(int j=0;j<test.size();j++){
    		cout<<test[j];
    		residus[k]=(AA)test[j];// Met le code ascii dans residus[k]
    		k++;
    	}
    	cout<<endl;
    }

    J'aimerai convertir un char en AA, mais quand je fais residus[k]=(AA)test[j],
    j'ai le code ascii.C'est pas ce que je veux.

    Quelqu'un peut m'aider?

    Alaninho

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Je ne sais pas trop à quelle sorte de conversion tu t'attendais en faisant ça.

    Quelle règle voudrais tu appliquer pour convertir un caractère (donc un code ascii le cas présent) en une énumération AA ?

    Une enum ne fait que définir une succession de constantes. C'est un peu comme si tu avais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define A 0
    #define R 1
    #define N 2
    #define D 3
    ...

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 674
    Points
    30 674
    Par défaut
    Salut,

    Il n'y a pas moyen de convertir "directement" une chaine de caractères en valeur énumérée, simplement, parce qu'une valeur énumérée a, par défaut, la taille d'un int

    Il est cependant possible de créer des fonctions qui fournissent les équivalences :
    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
    enum AA {A, R, N, D, C, Q, E, G, H, I, L, K, M, F, P, S, T, W, Y, V, B, Z, X, GO, GE, GT, AA_COUNT};
    static const char * enumStrings[AA_COUNT]={"A", "R", "N", "D", "C",
                                               "Q", "E", "G", "H", "I", "L", 
                                               "K", "M","F", "P", "S", "T", 
                                               "W", "Y", "V", "B", "Z", "X", 
                                               "GO", "GE", "GT"};
    std::string const enumToString(AA  value)
    {
        return std::string(enumStrings[value]);
    }
    AA stringToEnum(std::string const & value)
    {
        for(int i =0;i< AA_COUNT;++i)
        {
            if(value == enumStrings[i])
            {
                return i;
            }
        }
        assert(!"You should never come here");
    }
    (code non testé )

    Tu n'as donc "plus qu'à" invoquer ces fonctions selon tes besoins
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    J'utilise peu les énums, mais un truc du genre serait peut etre possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    enum AA {A='A', R='R', N='N', D='D', C='C', Q='Q', E='E',
     G='G', H='H', I='I', L='L', K='K', M='M', F='F', P='P', S='S', T='T',
     W='W', Y='Y', V='V', B='B', Z='Z', X='X', 
     GO, GE, GT, AA_COUNT};
    Reste le problème des multilettres, et du coup j'ai peut etre pas bien compris le problème

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    j'ai essayé ton code mais j'ai deux erreur :

    error: return value type does not match the function type ->correspond au return i

    error: no suitable constructor exists to convert from "char" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" --> appel de la fonction AA res=stringToEnum(test[i]); avec test un string


    Tu vois d'où ça peut venir?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Il n'y a pas moyen de convertir "directement" une chaine de caractères en valeur énumérée, simplement, parce qu'une valeur énumérée a, par défaut, la taille d'un int

    Il est cependant possible de créer des fonctions qui fournissent les équivalences :
    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
    enum AA {A, R, N, D, C, Q, E, G, H, I, L, K, M, F, P, S, T, W, Y, V, B, Z, X, GO, GE, GT, AA_COUNT};
    static const char * enumStrings[AA_COUNT]={"A", "R", "N", "D", "C",
                                               "Q", "E", "G", "H", "I", "L", 
                                               "K", "M","F", "P", "S", "T", 
                                               "W", "Y", "V", "B", "Z", "X", 
                                               "GO", "GE", "GT"};
    std::string const enumToString(AA  value)
    {
        return std::string(enumStrings[value]);
    }
    AA stringToEnum(std::string const & value)
    {
        for(int i =0;i< AA_COUNT;++i)
        {
            if(value == enumStrings[i])
            {
                return i;
            }
        }
        assert(!"You should never come here");
    }
    (code non testé )

    Tu n'as donc "plus qu'à" invoquer ces fonctions selon tes besoins
    j'ai essayé ton code mais j'ai deux erreur :

    error: return value type does not match the function type ->correspond au return i

    error: no suitable constructor exists to convert from "char" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" --> appel de la fonction AA res=stringToEnum(test[i]); avec test un string


    Tu vois d'où ça peut venir?

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 674
    Points
    30 674
    Par défaut
    Au temps pour moi...

    Il me semblait bien que j'oubliais un truc, et la deuxième erreur est induite par la première, comme bien souvent

    Voici le code corrigé, et testé
    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
    #include <string>
    #include <iostream>
    #include <cassert>
    enum AA {A, R, N, D, C, Q, E, G, H, I, L, K, M, F, P, S, T, W, Y, V, B, Z, X, GO, GE, GT, AA_COUNT};
    static const char * enumStrings[AA_COUNT]={"A", "R", "N", "D", "C",
                                               "Q", "E", "G", "H", "I", "L",
                                               "K", "M","F", "P", "S", "T",
                                               "W", "Y", "V", "B", "Z", "X",
                                               "GO", "GE", "GT"};
    std::string const enumToString(AA  value)
    {
        return std::string(enumStrings[value]);
    }
    AA stringToEnum(std::string const & value)
    {
        for(int i =0;i< AA_COUNT;++i)
        {
            if(value == enumStrings[i])
            {
                return AA(i);
            }
        }
        assert(!"You should never come here");
    }
    int main()
    {
        std::cout<<enumToString(A)<<std::endl;
        std::cout<<stringToEnum("A");
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    J'ai toujours l'erreur :

    error: no suitable constructor exists to convert from "char" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>"

    Donc je suppose que c'est un problème avec mon string test nn?

    En tout cas merci pour ton code.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    C'est bon, j'ai converti le char en string et ça marche.
    En tout merci de ton aide koala01.

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

Discussions similaires

  1. convertir char* en CString
    Par zelchico dans le forum MFC
    Réponses: 5
    Dernier message: 06/12/2007, 15h55
  2. Convertir Char* en String
    Par Blunt dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/07/2007, 16h46
  3. Convertir char* en string
    Par KorTeX22 dans le forum C++
    Réponses: 5
    Dernier message: 13/03/2007, 11h54
  4. Comparer 2 Char / Convertir Char -> Int
    Par mbk-w dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/06/2006, 11h09

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