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 :

struct+enum=erreur dans mon code


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut struct+enum=erreur dans mon code
    Bonjour,

    J'ai crée 2 structures, dont l'une contient un enum et lorsqu'il s'agit de manipuler un pointeur vers la structure rien ne va plus je reçois comme erreur : "invalid use of 'enum etat::deplacement' "

    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
    struct vecteur{
           int x;
           int y;
    };
     
    struct etat{
           int saut;
           enum deplacement{
                   droite, gauche
           };
    };
     
    struct entite{
           vecteur pos;
           vecteur vit[3];
           int masse;
           etat etats;
    };
    Sur un autre fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void checkPlayerInput(entite *player){
           if (keystates[SDLK_RIGHT]){
                     (*player).etats.deplacement = droite;  //l'erreure se declanche ici
           }
    }

  2. #2
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Dans ton code, deplacement est un type, pas une variable.
    Il te faut déclarer une variable de ce type dans etat :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct etat{
           int saut;
           enum type_deplacement{
                   droite, gauche
           };
           type_deplacement deplacement;
    };
    Je pense aussi qu’il te faudra accéder à droite avec etat::droite.

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct etat{
           int saut;
           enum type_deplacement{
                   droite, gauche
           } deplacement;
    };
    marche aussi

    Je pense aussi qu’il te faudra accéder à droite avec etat::droite.
    Dans le cas ou tu défini l'enum à l'intérieur d'état, alors oui ce sera etat::droite ou etat::gauche

    Par contre si l'enum est défini en dehors comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    enum type_deplacement{
                   droite, gauche
    };
     
    struct etat{
           int saut;
           enum type_deplacement deplacement;
    };
    ce sera juste droite/gauche
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci pour vos reponses,

    Je ne comprends pas ce que vous voulez dire par acceder à droite ou à gauche.

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par ornivan Voir le message
    merci pour vos reponses,

    Je ne comprends pas ce que vous voulez dire par acceder à droite ou à gauche.
    Dans l'enum, tu défini "droite" et "gauche" comme faisant parti de l'enum.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    enum type_deplacement{
                   droite, gauche
    };
    suivant la façon dont tu declare ton enum dans ton programme la façon d'accéder aux valeurs "droite" et "gauche" sera différente.

    par exemple pour cette définition de ta structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct etat{
           int saut;
           enum type_deplacement{
                   droite, gauche
           } deplacement;
    };
    tu devra ecrire dans ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void checkPlayerInput(entite *player){
           if (keystates[SDLK_RIGHT]){
                     (*player).etats.deplacement = etat::droite;  //l'erreure se declanche ici
           }
    }
    si l'enum est défini en dehors de etat, alors ton code précedent marchera.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ça marche trés bien merci !

    mais je ne comprends pas la raison de cette finesse que vous venez de me montrer.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    Le fait est que ton énumération est imbriquée dans la classe Etat.

    Tu dois donc, pour pouvoir utiliser les valeurs énumérées de celle-ci, fournir le chemin complet qui permet d'y accéder, à savoir Etat::gauche ou Etat::droite.

    Les classes et les structures agissent en effet comme le font les espaces de noms, en créant une sorte de "boite" dans laquelle il faut regarder pour en trouver le contenu.

    Cela s'observe bien lorsqu'il s'agit de définir une fonction dans une classe:
    MaClass.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MaClass
    {
        public:
            void foo();
    };
    MaClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MaClass::foo()
    {
        /* ce qui doit être fait */
    }
    Ce code permet au compilateur de comprendre que tu fournis la définition d'une fonction nommée foo qui se trouve... dans la classe nommé MaClass, et permet donc d'éviter toute ambiguïté avec d'autres fonctions foo éventuelles libre ou existant dans d'autres classe.

    Pour t'aider à comprendre d'avantage le principe:

    Tu sais sans doute que l'on ne peut normalement pas définir deux valeurs énumérées portant le même nom. Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    enum Enum1
    {
        gauche,
        droite
    };
    enum Enum2
    {
        haut,
        bas,
        gauche
    };
    sera refusé à la compilation parce que l'on définit deux fois dans "l'espace de noms global" le même symbole: gauche (en plus, gauche représente deux valeurs différentes, mais cela ne fait aucune différence )

    Par contre, le code suivant sera accepté, bien que l'énumération et les valeurs énumérées portent les même noms respectifs, justement parce que l'énumération définie dans MaClass n'est plus dans la protée de l'espace de noms global, mais bien dans la portée de... MaClass.
    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
    enum depalcement
    {
        gauche = 1,
        droite  = 2
    };
    class MaClass
    {
        public:
            enum deplacement
            {
                gauche = 3,
                droite = 4
            };
            void foo();
    };
    La preuve en est que le compilateur ne se plaindra absolument pas et qu'il te sera possible en utilisant le spécificateur de portée (qui prend la forme de <type>:: ), d'utiliser les quatre valeurs énumérées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main()
    {
        //accès au symbole "gauche" de l'espace de noms global
        std::cout<<gauche<<std::endl; // affiche 1
        //accès au symbole "droite" de l'espace de noms global
        std::cout<<droite<<std::endl; // affiche 2
        //accès au symbole "gauche" défini dans MaClass
        std::cout<<MaClass::gauche<<std::endl; // affiche 3
        //accès au symbole "droite" défini dans MaClass
        std::cout<<MaClass::droite<<std::endl; // affiche 4
        return 0;
    }
    Le cas "peau de banane" se situe au niveau des fonctions membres de la classe dans laquelle l'énumération est imbriquée.

    En effet, la fonction membre utilise en priorité ce qui se trouve dans la classe, et "verra" donc en premier l'énumération imbriquée.

    Pour indiquer que l'on veut utiliser un des symboles définis dans l'espace de noms globlal, il faudra faire précéder celui-ci de "::"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MaClass::foo()
    {
        std::cout<<gauche<<std::endl; // affiche 3
        std::cout<<::gauche<<std::end; //affiche 1 
    }
    NOTA: est il nécessaire d'attirer ton attention sur les risques qu'il peut y avoir à définir une même valeur énumérée dans différentes portées en lui faisant représenter des valeurs différentes
    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

Discussions similaires

  1. Où l'erreur dans mon code
    Par moonia dans le forum Langage
    Réponses: 3
    Dernier message: 21/06/2006, 14h16
  2. Réponses: 5
    Dernier message: 14/05/2006, 22h41
  3. Erreur dans mon code PHP
    Par jack_1981 dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2006, 10h01
  4. erreur dans mon code
    Par sacco dans le forum C
    Réponses: 4
    Dernier message: 14/04/2006, 11h50
  5. [VBA][Débutant][export]erreurs dans mon code?
    Par Christophe93250 dans le forum Access
    Réponses: 4
    Dernier message: 06/01/2006, 19h52

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