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 :

test sur clé enumeration


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Par défaut test sur clé enumeration
    Bonjour,

    Je suis entrain de faire une grammaire et afin de simplifier le code pour de futur evolution, je cherche a me servir des enumerations.

    Pour utiliser cette grammaire l'utilisateur entre une serie de lettre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //lettre presente dans la grammaire
    enum grammarLetter{
    	A,T,R,X,D,E,I
    	};
    L'utilisateur rentre donc une chaine de caractere que je redecoupe en char pour savoir chaque lettre utilisée.

    En faite j'aimerai faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char monOccurrence; //lettre de la grammaire a traiter
     
    if(monOccurence est une lettre de ma grammaire present dans mon enum)
       return true;
    sinon
       return false;
    Je sais qu'une enum permet de representer une chaine par un int mais ma question est peut on faire le test sur la clé de l'enum.

    Merci

  2. #2
    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
    Citation Envoyé par jolatouf
    Je sais qu'une enum permet de representer une chaine par un int mais ma question est peut on faire le test sur la clé de l'enum.
    Ce n'est pas exactement ça, on représente dans le fichier .cpp un entier par un nom de variable, pas par une chaîne de caractères. Quand le programme est compilé, le nom A, E, ... n'existe plus, il ne reste que la valeur

  3. #3
    Membre confirmé
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Par défaut
    Euh oui desoler je voulait dire variable pas chaine.

    Donc ce que j'essaye de faire n'est pas ce qu'il y a de plus simple un tableau ou une autre structure serait peut etre plus aproprié?

    Merci de ton aide

  4. #4
    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
    Un std::set ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Ou un tableau associatif (std::map) plutôt, non?
    Encore que si tu ne cherches que sur des caractères, une Lookup Table serait à la fois plus économique en temps, en code et peut-être même en mémoire...
    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.

  6. #6
    Membre confirmé
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Par défaut
    Merci,

    je vais etudier tous cela.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    S'il s'agit de verifier qu'un caractère est present dans l'enum,tu peux faire une fonction à ta sauce qui effectue le boulot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    grammarLetter getEnumGrammer(char o)
    {
        switch(o)
        {
         case 'A': return A;
         case 'T': return T;
    .....
        }
    }
    Un operateur de cast enum en char peut être interessent si l'on se trouve dans une classe.

  8. #8
    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
    Mouais... le std::map sert à faire la même chose en plus élégant.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Mais je trouve que std::map, c'est un peu la grosse artillerie.
    Pour des caractères ASCII, une Lookup Table avec une entrée par caractère (128 ou 256 entrées, quoi) pourrait être plus appropriée.
    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.

  10. #10
    Membre confirmé
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Par défaut
    Merci Luther,

    mais c'est justement pour eviter cela que je cherche une structure plus propre ou elegante...

    merci quand meme

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    OK.
    Je ne sais pas s'il faut parler de propreté ou d'élégance,
    mais le dilemme entre ces deux methodes se trouve dans le tandem
    allocation memoire (map) ou utilisation du processeur (appel de fonction).

    Alors en terme d'optimisation, je prefère mon simple appel de fonction.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Luther13: La lookup table serait peut-être plus économique que ton switch aussi, tu sais...

    Code C++ : 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
    #include <iostream>
     
    //lettre presente dans la grammaire
    //Evidemment, il faudra faire plus propre que "une seule lettre" plus tard
    enum grammarLetter{
            _=0,
            A,T,R,X,D,E,I
            };
     
    grammarLetter LookupTableAlpha[26] = {A,_,_,D,E,_,_,_,I,_,_,_,_,_,_,_,_,R,_,T,_,_,_,X,_,_};
     
    grammarLetter getEnumGrammer(char o) {
            if( o >= 'A' && o <='Z' ) {
                    return LookupTableAlpha[o-'A'];
            } else {
                    return _;
            }
    }
     
    int main(void)
    {
    for(char i='A' ; i<='Z' ; i++)
            std::cout << i << " : " << getEnumGrammer(i) << std::endl;
    }
    Edit: Testé et corrigé.
    Code en sortie : 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
    $>./testEnum
    A : 1
    B : 0
    C : 0
    D : 5
    E : 6
    F : 0
    G : 0
    H : 0
    I : 7
    J : 0
    K : 0
    L : 0
    M : 0
    N : 0
    O : 0
    P : 0
    Q : 0
    R : 3
    S : 0
    T : 2
    U : 0
    V : 0
    W : 0
    X : 4
    Y : 0
    Z : 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.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Faire une recherche linéaire sur 7 éléments ce n'est pas la mort non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static const std::string Characters = "ATRXDEI";
     
    if (Characters.find(c) != std::string::npos)
        Trouvé
    else
        Pas trouvé

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    - pas sûr qu'il y ait un intérêt à redescendre au niveau du caractère
    - il existe déjà quantité de parsers -> boost.spirit, antlr, lex/yaxx, ...
    - Préférant généralement générer mes enums, je me retrouve par la même occasion avec des tableaux triés de chaînes -- sur lesquels j'ai les accès directs pour le passage enum->chaîne, et l'accès en O(ln n) pour le passage chaine -> enum
    - Une bonne pratique avec les énums, c'est d'avoir une valeur de garde inatégnable. Si les valeurs sont consécutives, alors il suffit de tester par à ce max.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. faire un test sur un programme externe
    Par marieheraud dans le forum Windows
    Réponses: 3
    Dernier message: 02/09/2004, 18h32
  2. test sur un recordset
    Par georgeabitbol dans le forum ASP
    Réponses: 2
    Dernier message: 15/07/2004, 14h39
  3. [langage] Test sur un caractère
    Par GLDavid dans le forum Langage
    Réponses: 8
    Dernier message: 07/07/2004, 18h03
  4. test sur fichiers[forms9i]
    Par Challenger dans le forum Forms
    Réponses: 6
    Dernier message: 14/06/2004, 17h25
  5. Test sur un champs vide
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 27/04/2004, 12h54

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