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 :

Vérifier la valeur d'un type enum


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 8
    Par défaut Vérifier la valeur d'un type enum
    Shalom, Bonjour,

    J'ai un projet à rendre en C mais je bloque un peu sur ce type de problème:

    En fait, j'ai un type enum défini comme ceci:

    typedef enum { A = 2; B;C;...} rtype;

    Maintenant mon problème c'est que j'aimerais bien avoir une fonction du type:

    bool valeur_est_A(rtype id); Qui vérifie que la valeur de id est celle de A (Ainsi pouvoir le faire pour chaqun des éléments de cet enum).
    J'ai écris une fonction de ce type:

    bool valeur_est_A(rtype id) {
    if(id == A) { return true;}
    return false;
    }

    Mais cela ne fonctionne pas à la compilation, j'obtiens l'erreur: lvalue required as left operand of assignment

    Je ne sais pas trop quoi faire.
    Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Chez-moi ça marche
    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
    #include <stdio.h>
    #include <stdbool.h>
     
    typedef enum { A = 2, B, C = 5} rtype;
     
    bool valeur_is(rtype id, rtype x) {
    	return id == x;
    }
     
    int main() {
    	rtype x=B;
    	printf("A: %d\n", valeur_is(x, A));
    	printf("B: %d\n", valeur_is(x, B));
    	printf("C: %d\n", valeur_is(x, C));
    }

    Citation Envoyé par gumpman Voir le message
    Qui vérifie que la valeur de id est celle de A (Ainsi pouvoir le faire pour chaqun des éléments de cet enum).
    En effet, pourquoi faire simple. Moi c'est pareil, quand je veux checker les 1500 éléments de mon tableau, au lieu de faire "une" fonction un peu générique qui checke "un" élément, je préfère écrire 1500 fonctions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 8
    Par défaut
    Je viens de trouver une solution:
    C’est d’utiliser l’indexation que j’ai dans mon enum j’ai fait quelques chose qui ressemble à ça:

    bool est_A(rtype id) {
    if(id == 2){
    return true;
    }
    return false;
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gumpman Voir le message
    C’est d’utiliser l’indexation que j’ai dans mon enum
    Ce qui fait perdre définitivement tout l'intérêt d'utiliser un enum.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Attention, tu crées un enum anonyme. Il est important de donner un nom aux enum, struct et union. Rien n'empêche de leur donner le même nom que le typedef.
    J'écrirais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef enum rtype { A = 2, B, C = 5} rtype;  // rtype est un alias vers l'enum rtype
     
    bool  valeur_is(rtype id, rtype x) {
    	return id == x;
    }
    D'ailleurs l'enum est converti en sa veleur entière implicitement, l'inverse est aussi vrai mais peut produire un warning
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int  rtype_to_int( rtype  x ) {
       return  x;
    }
    rtype  int_to_rtype( int x ) {
       return  (rtype)x;
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Il est important de donner un nom aux enum, struct et union.
    Ah? Pourquoi faire? Si je crée un type avec un nom de type, à quoi sert le nom de la structure puisque le nom du type va prendre la prépondérance?
    A l'exception des structures nécessitant de connaitre leur propre identification au moment de l'écriture (exemple des listes chainées) je ne mets jamais de nom à mes structures
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct /* pourquoi mettre un nom puisque je crée un type ??? */ {
    	unsigned short jj;
    	unsigned short mm;
    	unsigned short aa;
    } t_date;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    Tu ne dis pas pourquoi ton code ne fonctionne pas

    Mais, il y des chances que tu tombes sur le "problème" des énumérations : les valeurs sont globales et donc ton nommage est très mauvais
    Il faut plutôt coder comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef enum e_rtype {
        G_RTYPE_A = 2,
        G_RTYPE_B,
        G_RTYPE_C = 5
    } t_rtype;
    • qu'on donne 1 nom ou pas, le compilateur va en donner 1 aux structures/ énumérations anonymes. Moi je commence par "e_" pour les énumérations et "s_" pour les structures
    • comme on crée 1 type et qu'on va utiliser dans le code, il faut mieux dire que c'est 1 type en commençant par "t_"
    • en C, il n'y a pas de "décoration de nom" (mangling en anglais), donc même si c'est pénible/ s'en rappeler/ …, il faut mieux rappeler le nom du type dans le nom de la valeur/ constante.
    • "G_", c'est pour "global"


    Et je tiens à signaler que lorsque @Sve@r dit de faire 1 algo générique, ton énumération n'est pas prévue pour cela : il manque le nombre de valeurs (toujours la dernière valeur, 1 astuce C ) et il faut éviter les trous dans les valeurs.
    Après peut-être que ce sont des valeurs imposées et j'ai 1 trou de mémoire sur la gestion des trous dans les valeurs
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef enum e_rtype {
        G_RTYPE_A = 2,
        G_RTYPE_B,
        G_RTYPE_C,
        G_RTYPE_NB_VALUES,
        G_RTYPE_FIRST = G_RTYPE_A
    } t_rtype;
     
     
    unsigned char rtype_is_value(t_rtype value) {
        return ((value >= G_RTYPE_FIRST) && (value < G_RTYPE_NB_VALUES));
    }
     
     
     
    int main(/*int argc, char* argv[]*/)
    {
        printf("RTYPE_A: %d\n", rtype_is_value(G_RTYPE_A));
        printf("RTYPE_B: %d\n", rtype_is_value(G_RTYPE_B));
        printf("7:       %d\n", rtype_is_value(7));
        printf("RTYPE_C: %d\n", rtype_is_value(G_RTYPE_C));
        printf("1:       %d\n", rtype_is_value(1));
        printf("5:       %d\n", rtype_is_value(5));
     
     
        return EXIT_SUCCESS;
    }

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    et j'ai 1 trou de mémoire sur la gestion des trous dans les valeurs
    T'as un trou sur la gestion des trous?
    Pas compliqué: chaque valeur non spécifiée récupère la précédente +1. Et si la première valeur n'est pas spécifiée, alors c'est 0 par défaut.
    Dans par exemple enum {A, B, C=7, D, E}, A=0 (non spécifié donc 0 par défaut), B=1 (non spécifié donc dernière valeur +1), C=7 (spécifié), D=8 (non spécifié donc dernière valeur +1) et E=9 (idem que pour D)

    Citation Envoyé par foetus Voir le message
    Et je tiens à signaler que lorsque @Sve@r dit de faire 1 algo générique, ton énumération n'est pas prévue pour cela
    Ben si un peu quand-même. Par exemple mon premier code me semble assez générique même avec son enum. Au lieu d'écrire une fonction "valeur_is_A" et une autre "valeur_is_B" (et yalla si l'énum contient 50 items !!!) j'ai écrit une fonction "valeur_is" et je lui passe les valeurs à checker...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben si un peu quand-même.
    Oui il est générique … mais pas tant que cela parce que tu passes la valeur à tester.

    C'est surtout si tu fais 1 boucle pour parcourir les valeurs for(val=G_RTYPE_FIRST, val < G_RTYPE_NB_VALUES, ++val), tu vas prendre en compte les trous.
    Pour 1 code complètement générique.
    Le nom de la constante, c'est pour l'humain … je pense même que le débugger ne l'affiche pas lorsque tu es en pas à pas.

    Pour les trous peut-être "casser" son énumération en parties contiguës ? ou utiliser 1 tableau associatif ?

  10. #10
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Citation Envoyé par gumpman Voir le message
    J'ai un projet à rendre en C mais je bloque un peu sur ce type de problème:

    En fait, j'ai un type enum défini comme ceci:

    typedef enum { A = 2; B;C;...} rtype;

    Maintenant mon problème c'est que j'aimerais bien avoir une fonction du type:

    bool valeur_est_A(rtype id); Qui vérifie que la valeur de id est celle de A (Ainsi pouvoir le faire pour chaqun des éléments de cet enum).
    J'ai écris une fonction de ce type:

    bool valeur_est_A(rtype id) {
    if(id == A) { return true;}
    return false;
    }

    Mais cela ne fonctionne pas à la compilation, j'obtiens l'erreur: lvalue required as left operand of assignment

    Je ne sais pas trop quoi faire.
    Merci d'avance !
    Je ne vois pas d'assignement dans ce que tu écris.

    Edit (my bad ) : dans l'enum, ce n'est pas un ; qui sépare les valeurs, mais une ,

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

Discussions similaires

  1. accéder aux valeurs énoncées dans type enum ?
    Par ludophil dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/10/2006, 12h57
  2. lister les valeurs d'un champs de type enum...
    Par korrigann dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/04/2006, 15h44
  3. Type enum et pas de valeur dans le champs
    Par GreenGoblin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 23/03/2006, 16h09
  4. 1 champ de type enum à 3 valeurs ou 2 champs booléens ?
    Par El Saigneur dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/01/2005, 08h53
  5. [MySQL] Valeur par défaut d'un type ENUM
    Par aliasjcdenton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/10/2004, 20h44

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