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 :

Utilisation d'une énumération


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Utilisation d'une énumération
    Bonjour à tous,

    Considérons cette énumération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    enum MonEnum
    {
        ValeurA,
        ValeurB,
        ValeurC,
        Valeur1,
        Valeur2,
        Valeur3
    };
    J'ai une fonction qui prend un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void MaFonction(unsigned int uiEntier)
    {
        MonEnum eValue;
        switch(uiEntier)
        {
            case 1:
               eValue = Valeur1; break;
            case 2:
               eValue = Valeur2; break;
            case 2:
               eValue = Valeur2; break;
        }
    }
    Que j'aimerai transformer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void MaFonction(unsigned int uiEntier)
    {
         MonEnum eValue = Valeur1 + (uiEntier - 1);
    }

    Mais le compilateur m'indique qu'il ne peut pas transformer un unsigned int en MonEnum.

    Que dois-je faire ?


    Merci beaucoup


    A bientôt

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Il te faudra faire un cast explicite avec static_cast<>.
    Le C++ n'accepte déjà pas les opérations arithmétique sur les enums, il les convertit en int; là, tu fais carrément une opération arithmétique sur une enum et un int, donc...

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MaFonction(unsigned int uiEntier)
    {
         MonEnum eValue = static_cast< MonEnum >(Valeur1 + (uiEntier - 1));
    }
    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.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    A mon avis, c'est risqué ce que tu veux faire (même si cela marche)

    Peut être que plus tard tu voudras modifer ton enum comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    enum MonEnum
    {
        ValeurA = 12,
        ValeurB = 17,
        ValeurC = 20,
        Valeur1 = 5,
        Valeur2 = 8,
        Valeur3 = 1
    };
    Et la ta fonction ne marchera plus du tout.

    Je préfère :
    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
     
    void MaFonction(unsigned int uiEntier)
    {
        MonEnum eValue;
        switch(uiEntier)
        {
            default:
               eValue = ValeurA; break; // valeur par defaut
            case 1:
               eValue = Valeur1; break;
            case 2:
               eValue = Valeur2; break;
            case 2:
               eValue = Valeur2; break;
        }
        return eValue;
    }
    Qui a le mérite d'être plus "safe"
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    screetch
    Invité(e)
    Par défaut
    d'un autre coté peut etre un jour voudras tu transformer ton enum comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum MonEnum
    {
        ValeurA,
        ValeurB,
        ValeurC,
        Valeur1,
        Valeur2,
        Valeur3,
        Valeur4,
        Valeur5,
        Valeur6
    };
    et la c'est la seconde version qui fonctionnera. et ce genre de modif arrive plus souvent que rendre les index aleatoires...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ouais c'est clair que ça encourage les effets de bords ce que je souhaite faire.
    Mais en même temps j'ai une énumération qui va de Valeur1 à Valeur31... un switch de 31 "case"... c'est moche quand même.

    Sinon j'ai vu sur le net MonEnum(Valeur1 + x)

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ne le fais pas et utilise le static_cast à la place.
    Un cast function-style, c'est aussi dangereux qu'un cast C-style: En C++, c'est généralement à bannir.
    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.

Discussions similaires

  1. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27
  2. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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