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 :

Variable enum et unqualified-id


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut Variable enum et unqualified-id
    Bonjour,
    Voici la portion de code qui concerne ce probleme:

    Intervalle.cxx
    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
    Intervalle::Intervalle (double a, double b, char* e)
    {
    	if (e!="EMPTY" && e!="NO_EMPTY")
    	{
    		cout<<"Erreur sur le 3e parametre : sa valeur doit etre EMPTY ou NO_EMPTY.\n"<<endl;
    	}
    	else
    	{
    		if (min2(a,b)<-1000000 || max2(a,b)>1000000)
    		{
    			cout<<"Erreur sur les bornes : doivent etre comprises entre -1000000 et +1000000"<<endl;
    		}
    		else
    		{
    			inf=min2(a,b);
    			sup=max2(a,b);
    			IntervalleType=e;
    		}
    	}
    }
    Intervalle.hxx
    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
    #ifndef INTERVALLE
    #define INTERVALLE
     
    class Intervalle
    {
    	private:
    	double inf;
    	double sup;
    	enum IntervalleType
    	{
    		EMPTY = 0,
    		NO_EMPTY = 1
    	};
     
    	public:
    	Intervalle(double, double, char*);
    	Intervalle operator + (const Intervalle&);
    	Intervalle operator - (const Intervalle&);
    	Intervalle operator * (const Intervalle&);
    	Intervalle operator / (const Intervalle&);
    	void AfficheIntervalle (void);
    	void IntervalleInitialise (double, double, char*);
    };
    #endif
    Probleme:

    Le compilateur me dit pour la ligne en rouge:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intervalle.cxx:49: error: expected unqualified-id before ‘=’ token
    Il y a aussi d'autres erreurs de compilation, mais que je prefere chercher tout seul pour l'instant.

    C'est a travers Internet que j'ai appris a utiliser les enum, mais apparemment j'ai zappe quelque chose. Pouvez-vous eclairer ma lanterne ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Concernant le fait de montrer qu'une seule erreur de compil tu peux mais seulement si c'est la première erreur. Car des fois certaines erreurs disparaissent après avoir corrigé la première.

    Concernant ton histoire d'enum, tu affectes un char* à un enum de type int. Pour moi c'est là que ce situe le problème.
    De même concernant tes tests entre un char* et une chaine de caractères, j'avoue que celà me parait bizarre (tu n'as pas une erreur de compil la dessus ).

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    En fait, le prof me dit dans son sujet: "IntervalleType est de type enum et determine si l'intervalle est vide ou non en prenant les valeurs EMPTY et NO_EMPTY".

    Si l'enum est un enum de int, comment l'associer a EMPTY et NO_EMPTY?

    Et pour la comparaison de char* et string, j'ai effectivement des "Warnings" mais pas des erreurs. Ayant compris que "techniquement" c'est la meme chose, je ne vois pas non-plus pourquoi. Cela dit, je n'arrive pas a utiliser "string" : meme avec #include <string>, il ne connait pas...

    PS : Je suis sous Ubuntu avec g++ et desole pour l'absence d'accents dans mes posts, mais je suis sous Linux avec un Qwerty, donc...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Les strings et les char ne sont pas la même chose, les string c'est du C++ les char c'est un reste du C.
    Pour pouvoir utiliser les string il faut que tu déclare leur espace de nimage c'est à dire :
    si tu ne veux pas utiliser la résolution de l'espace de nomage std:: alors il faut que tu mettes dans ton code (dans ton .cxx par exemple :
    Un enum te permet d'utiliser des noms de variables plutôt que des numéros. Tu dois donc utiliser directement NO_EMPTY et EMPTY dans ton code sans les ". Par contre tu dois les comparer à integer et non un char.
    L'intérêt des enum est que plutoyt d'avoir a se souvenir que 0 signifie EMPTY, on l'appel directemet EMPTY, le compilateur remplacera EMPTY par 0 .
    Jette un oeil ici

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

    Informations professionnelles :
    Activité : aucun

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

    Ton énumération est de type... IntervalleType. La signature correcte de ta fonction devrait donc être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intervalle(double, double, IntervalleType);
    ou, sous la forme "pleinement qualifiée", proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intervalle::Intervalle(double, double, Intervalle::IntervalleType);
    ce qui te permettra, lors de la déclaration d'une variable, d'écrire quelque chose proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main()
    {
        Intervalle i(2.3, 3.1415926, Intervalle::NO_EMPTY);
    }
    Les valeurs énumérées sont, quant à elle, des numériques entières, ce qui fait qu'il ne faut pas les comparer avec des chaines de caractères, mais bel et bien avec... des valeurs numériques entières )
    La première partie de ta fonction devrait donc prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (e!=EMPTY && e!=NO_EMPTY)
    {
        cout<<"Erreur sur le 3e parametre : sa valeur doit etre EMPTY ou NO_EMPTY.\n"<<endl;
    }
    (Penses, en outre, au fait que, si tu écris "EMPTY" ou "NO_EMPTY", tu te trouve face à des chaines de caractères "C style", et qu'il faudrait donc les comparer avec les fonctions strcmp et similaires, sous peine de comparer... la valeur de l'adresse à laquelle se trouve le premier caractère de chaque chaine )

    Enfin, même si ce n'est qu'un détail, il serait sans doute préférable de lancer une exception qui permettrait de récupérer l'erreur survenue plutôt que de demander directement au constructeur d'envoyer quelque chose vers la sortie standard : tu n'es en effet meme pas sur, en créant ta classe, que "ce qui va l'utiliser" dispose, effectivement, d'une sortie standard

    En outre, l'envoi de données vers la sortie standard (ou vers toute autre sortie d'ailleurs) est une responsabilité qui n'a absolument pas à échoir ni au constructeur (de manière particulière) ni même à l'objet (de manière générale)

    Et, comme, de plus, si une erreur survient, il s'agit d'éviter la création de l'objet, cela te permettrait de simplifier ta logique 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //l'exception lancée si on s'est trompé dans l'intervalle
    struct BadType: public std::exception
    {
        const char * what() const throw(){return "Erreur dans le type d'intervale";}
        ~BadType() throw(){}
    };
    // l'erreur lancée si on s'est trompé dans les valeurs
    struct BadValues : public std::sexception
    {
        const char * what() const throw(){return "Erreur sur les bornes : doivent etre comprises entre -1000000 et +1000000";}
        ~BadValues () throw(){}
    }
    //le constructeur de intervale
    Intervalle::Intervalle(double v1, double v2, Intervalle::IntervalleType t)
    {
        if(t!=EMPTY && t!= NO_EMPTY)
            throw BadType();
        if (min2(a,b)<-1000000 || max2(a,b)>1000000)
            trhow BadValues();
        inf=min2(a,b);
        sup=max2(a,b);
        IntervalleType=e;
     
    }
    et de l'utiliser 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
    14
    15
    16
    int main()
    {
        Intervalle::IntervalleType t= /* détermination de l'intervale type */
        double v1 = /* détermination de la première valeur */
        double v2 = /* détermination de la seconde valeur */
        try
        {
            Intervalle i(v1, v2, t );
            /* ... */
        }
        catch( std::exception & e)
        {
            /* c'est ici qu'il faut, si nécessaire, provoquer l'affichage */
            std::cout<<e.what();
        }
    }
    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

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Merci pour ces explications. Effectivement, j'ai declare l'enum en tant que variable globale publique, puis je rentre en parametre de mon constructeur un int. Et ca marche !

    Pour tes conseils sur les exceptions et compagnie, je ne suis malheureusement pas encore assez a l'aise avec le langage pour les suivre. Mais je les garde sous la main pour une utilisation ulterieure.

    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/08/2011, 00h22
  2. Réponses: 3
    Dernier message: 11/10/2010, 12h50
  3. assigner un enum a une variable
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 14/04/2010, 16h56
  4. trop de Variables globales donc enums ou autre
    Par mimi31110 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 29/06/2008, 20h18
  5. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22

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