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'un enum pour un flag


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut Utilisation d'un enum pour un flag
    Bonjour.

    Je voulais faire usage d'un enum pour contenir et faire afficher l'état d'un flag, mais je n'obtiens pas le résultat recherché !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum sortie_capteur{Tc_K_ON, Pyro_ON};//crétaion du type
    sortie_capteur capteur_en_service = Tc_K_ON;//création et initilaisation de mon flag de type sortie_capteur
    code modifiant la valeur de capteur_en_service
    .
    .
    cout << "Capteur en service : " << capteur_en_service << endl;
    cela affiche :
    Capteur en service : 0
    ou
    Capteur en service : 1

    En fait, si je comprends bien, le code fait bien ce que je lui demande, mais pas ce que je voudrais.
    Ce que je voudrais c'est afficher :
    Capteur en service : Tc_K_ON
    ou
    Capteur en service : Pyro_ON

    Comment faire celà ?

  2. #2
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Bonjour

    Je pense que tu trouveras des éléments de réponse ici :

    https://stackoverflow.com/questions/...le-to-a-string

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 32
    Par défaut utilisation enum pour un flag
    Salutations j'ai peut-être une solution pour toi. Il faudrait tout simplement que tu redéfinisses l'opérateur << et que tu utilises la notation constexp.
    Je te joins un programme d'exemple.

    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
     
    #include <iostream>
    enum Metal
    {
    	Cuivre,
    	Fer,
    	Bronze
    };
    std::ostream& operator<<(std::ostream &os, Metal m)
    {
    	static constexpr const char *noms[] =
    	{
    		"Cuivre", "Fer", "Bronze"
    	};
    	return os << noms[m];
    }
    Metal m = Metal::Cuivre;
     
    int main()
    {
    	std::cout << m << std::endl;
     
    }
    En espérant que ça t'aide !
    Je te joins le lien de mon chic prof pour t'aider à comprendre : https://h-deb.clg.qc.ca/Sujets/AuSec...ndre-enum.html
    Il y a surement une solution plus simple mais celle ci marche !

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il faut déjà commencer par comprendre que, une fois que le code que tu as écrit est traduit en code binaire exécutable, tout ce qu'il reste, tout ce que le processeur est capable de manipuler, ce sont des valeurs numériques codées en binaires, qui peuvent être:
    1. un numéro de circuit par lequel faire passer une information pour obtenir un résultat donné (autrement dit : un numéro d'instruction connue du compilateur)
    2. une adresse mémoire
    3. une valeur dont l'interprétation (le nombre de bits utilisés, et la signification donnée à chacun d'eux) dépendra du contexte

    (bon, pour le (1), je simplifie et j'extrapole énormément, mais c'est pour te permettre de comprendre )

    Tous les identifiants que l'on peut disséminer dans le code (nom de type, de donnée, de fonction, de valeur énumérées) n'existent plus dans le code binaire. Il n'ont en effet du sens que pour le développeur qui lit le code, et l'une des premières choses que le compilateur va faire, c'est de créer une "table d'équivalence" qui lui permettra de connaitre le nombre de bits qu'il doit prévoir pour représenter ces différents identifiants.

    Même la notion de caractère n'est jamais qu'un "table d'association" entre des valeurs numériques (comprise, pour la table ASCII entre 0 et 255 inclus) et des "glyphes" qui seront affichés à l'écran.

    Dés lors, quand tu définis une énumération sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* cela revient au même que ton code, mais c'est plus lisible :D */
    enum sortie_capteur{
        Tc_K_ON, 
        Pyro_ON
    };//crétaion du type
    le compilateur va créer une "table d'équivalence" dans laquelle Tc_K_ON sera associé à la valeur 0 et Pyro_ON sera associé à la valeur 1, et ce sont ces valeurs qui seront effectivement utilisées dans le code binaire que le processeur pourra comprendre.

    Si tu veux que ces valeurs soient interprétées autrement que comme 0 et 1 --entre autres lors de l'affichage -- tu dois forcément indiquer au processeur comment il doit les interpréter, les manipulations qu'il doit entreprendre pour te donner le résultat que tu espère.

    L'une des solutions serait de surcharger l'opérateur << pour ton énumération, en la modifiant un tout petit peu pour lui donner la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* cela revient au même que ton code, mais c'est plus lisible :D */
    enum sortie_capteur{
        Tc_K_ON, 
        Pyro_ON,
        MAX_SORTIE // == 2, uniquement utilisé dans l'opérateur <<
    };//crétaion du type
    et en définissant l'opérateur << sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    std::ostream & operator<<(std::ostream & ofs, sortie_capteur sortie){
        assert(sortie < MAX_SORTIE && "unknown flag"); // parce que le développeur 
                                                       // est un imbécile distrait
                                                       // (requière #include <cassert> )
        /* requière le support de C++11 ou supérieur, et #include <array> 
         * définit les chaines de caractères que nous voulons afficher, pour chaque
         * valeur de l'énumération
         */
        static std::array<std::string, MAX_SORTIE> const strings={"Tc_K_ON", "Pyro_ON"};
        ofs<<strings[sortie];
        return ofs;
    }
    qui nous permettra d'avoir un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(){
        sortie_capteur capteur_en_service = Tc_K_ON;
        std::cout << "Capteur en service : " << capteur_en_service << std::endl;
    }
    dont la sortie ressemblera à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    philippe@philstower:~/Documents$ ./a.out 
    Capteur en service : Tc_K_ON
    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

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Ce que vous présentez me semble un peu compliqué (je débute), mais je me suis inspiré de ce que j'ai pu voir.

    J'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enum sortie_capteur{Tc_K_ON, Pyro_ON};//crétaion du type
    sortie_capteur capteur_en_service = Tc_K_ON;//création et initilaisation de mon flag de type sortie_capteur
    String capteur[2]={"Tc_K_ON", "Pyro_ON"};
    code modifiant la valeur de capteur_en_service
    .
    .
    cout << "Capteur en service : " << capteur[sortie_capteur] << endl;
    En fait le code suivant au lieu de "cout <<" car je code en Arduino.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Serial.print("Capteur en service : ") ;
    Serial.println( capteur[sortie_capteur]);
    Ca à l'air d'être satisfaisant.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Perso, si j'ai besoin d'avoir une string pour mon enum, je préfère écrire mon enum via macros dans un fichier à part pour générer tout ça.
    Du genre
    Enum.inl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef ENTRY
    #error You need to #define ENTRY before including this file!
    #endif
     
    ENTRY(Value1)
    ENTRY(Value2)
     
    #undef ENTRY
    Enum.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    enum Enum {
    #define ENTRY(v) v,
    #include "Enum.inl"
    };
    inline const char* ToString(Enum val) {
      switch(val) {
      #define ENTRY(v) case v : return #v;
      #include "Enum.inl"
      default: return "<unknown>"; // ou throw std::invalid_argument("Valeur inconnue");
      }
    }
    Parce que devoir retourner à X endroits du code pour ajouter ou supprimer une entrée, y'a pas plus chiant et source d'erreur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Je peux comprendre la remarque, mais je ne sais pas exploiter cette histoire de macros ni ne comprends votre code ! Je suis désolé de ne pouvoir profiter plus de vos informations.

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

Discussions similaires

  1. [C#] Utilisation d'une ProgressBar pour un téléchargement
    Par snoof dans le forum Windows Forms
    Réponses: 10
    Dernier message: 04/10/2004, 19h37
  2. Peut-on utiliser les SGBDs libres pour construire un DWH ?
    Par daabos dans le forum Alimentation
    Réponses: 6
    Dernier message: 01/10/2004, 10h35
  3. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20
  4. Utiliser le port parallele pour simuler un digicode
    Par nonoRedDevils dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/12/2003, 13h23
  5. utilisation d'objets ADO pour CMS sur POSTGRESQL7.3.2
    Par turbok dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/10/2003, 09h29

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