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 :

Les enums et leurs utilités ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut Les enums et leurs utilités ?
    Bonjour,
    je suis curieux, je connaissais les enum, mais j'avais jamais vraiment utilisé, mais je me demandais à quoi ça sert de les utiliser ?
    Je vois la simplicité si on veut faire une liste de definition, mais ça revient au même qu'un simple define.

    Et si je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum mois_en_r { janvier = 1, fevrier, mars, avril, septembre = 9, octobre, novembre, decembre } a;
    printf ("%d", a);
    Que représente a ? un bloc mémoire quelconque ? et pourquoi attribuer les élements à la variable 'a', quel peut en être l'intérêt ?

    merci d'avance !

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Oui, tu peux te débrouiller pour faire la même chose qu'une énumération avec une suite de #define.
    C'est surtout une question de lecture du code (lisibilité), ça permet de regrouper plusieurs constantes comme étant un type, qui peut prendre certaines valeurs. Définir une énumération ne définit pas un domaine de définition mais des constantes symboliques représentant des entiers (de type int je crois).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - Par un enum, on définit des symboles représentant des constantes entières. On peut aussi faire la même chose avec #define.
    Une variable de type enum est d'un type entier. Le type exact peut être différent selon la définition de l'enum ou/et le compilateur utilisé.
    Comme on ne connait pas à priori le type exact (entier) d'une variable de type enum, on a un comportement imprévisible sur ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    enum mois_en_r x;
    scanf("%d", &x);
    Les constantes définies dans l'enum ont le type int

    - Le lecteur est également en droit de s'attendre à ce que l'enum ne soit pas un fourre-tout mais que les termes de l'enum soient liés logiquement entre eux. On voit difficilement la logique d'un programmeur dans l'enum suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum {rouge, lundi, bonjour, erreur} uneEnum;
    - Le C n'impose pas que la valeur d'une variable de type enum soit l'un des membres de l'enum : il n'y a pas de vérification de ce fait.
    (L'enum que tu proposes pour coder les mois en "r" risque de ne pas pouvoir être utilisée comme tu le penses car rien n'interdit à une variable enum de ce type d'avoir la valeur 8 et on ne peux savoir si une valeur fait partie d'une enum sans faire des tests sur chaque valeur possible de l'enum.)

    - L'utilité d'une enum est donc essentiellement documentaire. Bien que rien ne l'impose, le lecteur attend lui qu'une variable de type enum prenne comme valeur l'une des constantes du type enum. Il suppose implicitement que c'est pour cela que le programmeur a pris la précaution de définir une enum.
    Ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //.h
    typedef enum {rouge, orange, jaune, vert, bleu} Couleur;
    void fonc(Couleur x);
    //.c
    Couleur c = orange;
    fonc(c);
    fonc(rouge);
    est déjà plus parlant sur les intentions du programmeur que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //.h
    void fonc(int x);
    //.c
    fonc(1);
    fonc(0);
    ou même que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //.h
    #define rouge 0
    #define orange 1
    void fonc(int x);
    //.c
    int c = orange;
    fonc(c);
    fonc(rouge);

  4. #4
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut
    Tout ça vient du tutoriel qu'il y a sur le site
    http://c.developpez.com/cours

    ok, je vais donc changer quelques de mes define par des enum.

    merci

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Avantage non négligeable, dans un débogueur un enum affichera un label et non pas un entier. C'est quand même plus parlant de voir affiché "mercredi", "timeout" ou "rouge" que 7, 15 ou 32.

    La gestion des switches est également beaucoup plus parlante avec des enums qu'avec des entiers. Et là encore, l'enum est mieux que le define, puisqu'il n'autorise comme valeurs à tester que ce qui est défini sa liste.

    A+

    Pfeuh

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Et là encore, l'enum est mieux que le define, puisqu'il n'autorise comme valeurs à tester que ce qui est défini sa liste.
    Non, comme on l'a démontré plus haut...

    (Cela est vrai lors du passage à une fonction, cela est faux lors d'une utilisation dans le même bloc... je crois. Mais je n'en utilise jamais)

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

Discussions similaires

  1. [CLOB/BLOB] Quelles sont leurs utilités ?
    Par maximus001ma dans le forum DB2
    Réponses: 8
    Dernier message: 01/02/2006, 15h30
  2. Réponses: 1
    Dernier message: 20/12/2005, 19h50
  3. Lister les process avec leurs arguments
    Par jamfr73 dans le forum MFC
    Réponses: 5
    Dernier message: 23/12/2004, 10h54
  4. Réponses: 4
    Dernier message: 13/12/2004, 20h37
  5. Les utilitaires utile et leur utilités
    Par netah25 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 27/10/2004, 12h26

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