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 :

Problème d'une énumération


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut Problème d'une énumération
    Bonjour à tous,
    je copie ici ce que j'ai posté dans une mauvaise section du forum (j'espère ne pas m'être trompé cette fois):


    Alors voici, je voudrais créer un jeu de carte en C++ et pour ce faire, j'ai utilisé l'énumération pour créer mes cartes:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum TValeur{un=1,deux=2,...,roi=13};

    (de même pour les quatre couleurs que j'ai appelé "TCouleur")

    Cela dis, étant débutant en C++ (comme en programmation en général) je ne connais pas très bien l'énumération.

    mon problème est que je dois faire une boucle for dans ma classe paquetdecarte comme suit:


    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
    Code :
     
    PaquetDeCarte::PaquetDeCarte()
    {
         int i=0;
     
         for(enum TValeur vl=un; vl<=roi; vl++)
         {
              for(enum TCouleur cl=coeur; cl<=pique; cl++)
              {
                    T[i]=new Carte(vl, cl);  // T étant un pointeur sur Carte.
                    i++;
              }
         }                                
    }


    Mais voila, le compilateur m'affiche une erreur concernant les vl++ et cl++
    voici l'erreur:


    no `operator++(int)' declared for postfix `++', trying prefix operator instead
    no match for 'operator++' in '++((Carte*)this)->Carte::Val'
    Voila donc je souhaiterais un coup de pouce de votre part (sachant que je compile sous devC++ 4.9.9.2 BETA)

    Si vous avez besoin de tout mon projet, je peux vous le passer.

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    A ma connaissance, le mot clef enum ne peut être utilisé que pour définir ton enum (je crois qu'il n'est même pas possible de faire une déclaration anticipée).

    Tu vas avoir des problemes si tu essaye de faire ++ sur une enum.

    La solution est de convertir ton enum en type de base comme int ou size_t

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for( int vl=un; vl<=trois; ++vl)
        {
        }

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Ok j'essaierai ça dès ce soir,
    la conversion d'une enum vers un int ce fait bien automatiquement sans ligne de programme?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Je n'avais pas compris que tu n'avais pas vu dans mon message qu'on pouvait utiliser un entier pour désigner un enum. Oui, la conversion est automatique.

    Autre solution, surcharger l'opérateur ++ mais tu n'en as pas nécessairement besoin mais je l'ai déjà expliqué ici http://www.developpez.net/forums/sho...d.php?t=456045

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Oui, j'avais essayé pour la surcharge de l'operateur++ mais celle ci me posait des erreurs de compilation aussi et étant donné que tu m'avais dis qu'il n'y avait normalement pas de problème tant qu'il n'y avait pas de trou dans mon enum.

    Je vais essayer le code maintenant...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Citation Envoyé par Somato Voir le message
    tu m'avais dis qu'il n'y avait normalement pas de problème tant qu'il n'y avait pas de trou dans mon enum
    Non, ce n'est pas ce que j'avais voulu dire mais j'avoue que c'était ambigu. Si tu veux pouvoir utiliser un entier pour désigner un enum, il faut absolument qu'il n'y ait pas de trous.

    La surcharge de l'opérateur ++ telle que je te l'ai donné ne devrait pas poser de problèmes de compilation mais dans ton cas n'est pas forcément nécessaire.

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Ok, j'ai essayé la solution à l'instant, sa a l'air de marcher pour la conversion des enum en int,
    mais la suite de mon programme coince:

    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
    PaquetDeCarte::PaquetDeCarte()
    {
         enum TValeur vl; 
         enum TCouleur cl; 
         int i=0;
     
         for(int vl=un; vl<=roi; vl++)
         {
              for(int cl=coeur; cl<=pique; cl++)
              {
                    T[i]=new Carte(vl, cl);  //c'est ici que sa coince
                    i++;
              }
         }                               
    }
    je récolte le type de message d'erreur suivant:

    invalid conversion from `int' to `TValeur'
    initializing argument 1 of `Carte::Carte(TValeur, TCouleur)'
    La conversion d'enum vers int se passe donc apparement bien mais la suite un peu moins.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui je ne connais pas de solution très propre pour résoudre ce problème... En général les enums en C++ sont à utiliser avec parcimonie (c'est ma politique en tout cas).

    un static_cast devrait résoudre ton problème mais ce n'est pas très beau ni pratique...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum TValeur { un = 1, deux = 2 };
     
    int main()
    {
      TValeur test = static_cast<TValeur>(1);
    }

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Merci pour ta proposition mais finalement on m'a indiqué le chemin à suivre, et il semble que se soit propre!

    Mais cette fois, j'ai un autre (petit) problème.
    Je vous mets le code nouveau:

    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
    PaquetDeCarte::PaquetDeCarte()
    {
     
         int i=0;
     
         for(TValeur vl=un; vl<=roi; vl= (TValeur) ((int) vl + 1))
         {
              for(TCouleur cl=coeur; cl<=pique; cl= (TCouleur) ((int) cl + 1))
              {
                    T[i]=new Carte(vl, cl);
                    i++;
              }
         }                               
    }
     
     
    PaquetDeCarte::~PaquetDeCarte()
    {
     
         int i=0;
     
         for(TValeur vl=un; vl<=roi; vl= (TValeur) ((int) vl + 1))
         {
              for(TCouleur cl=coeur; cl<=pique; cl= (TCouleur) ((int) cl + 1))
              {
                    delete[i];
                    i++;
              }
         }  
    }
    Mon nouveau problème est mon delete de tableau dans le destructeur.
    je voudrais donc détruire tout les pointeurs vers Carte, et je sais que la syntaxe et :

    j'ai pourtant essayé et le compilateur ne m'affiche plus d'erreur, mais comment vérifier qu'il fait bien le travail demandé? surtout étant donné qu'on ne nous à pas enseigné sa en cours (ou j'ai mal compris)

    que dois-je donc mettre?

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    A savoir aussi que dans mon main je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PaquetDeCarte P1();
    cout << P1;
    et que ceci ne m'affiche que "1"
    Alors que j'arrive très bien à afficher une carte seule de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Carte C1(un, trefle);
    cout << C1;
    je ne pense pas que ceci est due à un problème de pointeur (auquel cas j'aurais une liste d'adresses hexadecimales en affichage)

  11. #11
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    La syntaxe du delete[] est simplement : delete[] NomDuTableau;
    mais c'est pour si tu as utilisé new [] (c'est a dire crée un tableau de valeurs dynamiques).

    Comme tu as alloué un tableau statique, mais chaque contenu du tableau avec un pointeur donné par un simple new à chaque fois, il faut faire delete pour chaque pointeur que tu as crée en faisant une boucle (comme à la création).

  12. #12
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par Somato Voir le message
    j'ai pourtant essayé et le compilateur ne m'affiche plus d'erreur, mais comment vérifier qu'il fait bien le travail demandé? surtout étant donné qu'on ne nous à pas enseigné sa en cours (ou j'ai mal compris)

    que dois-je donc mettre?

    c'est donc il me semble la bonne a chose à faire, pour autant que ce soit dans une boucle sur tous les éléments que tu as crée avec new.

    PS : dans ce que t uas posté de complet,
    n'as pas de sens, tu n'indiques pas le tableau, seulement l'indice.

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    D'accord je comprends mieux avec ces histoires de tableau dynamique et statique, mais je dois pourtant avoir un problème dans mon constructeur car j'ai un paquet vide en faisant ce code dans mon main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PaquetDeCarte P1();
    cout << P1;
    sachant que mon opérateur << doit être correctement surchargé étant donné que j'arrive à afficher
    Deux de cœur
    lorsque je crée une carte seule.

    Qu'en pensez vous d'après mon code? moi je n'arrive pas à identifier ce qui cloche, tout en sachant que lorsque je compile le code dans mon main, j'ai un warning sur: me disant en gros que ceci ne peut prendre comme valeur que:
    true
    (d'où l'affichage d'un "1" à l'exécution).

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ceci est une déclaration de fonction (nommée P1, ne prenant aucun paramètre et renvoyant un PaquetDeCarte).

    Je pense que tu veux plutôt ceci :

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    J'ai déjà essayé ta solution, elle bourre mon main.cpp d'erreurs

    je veux créer un paquet de 52 pointeurs vers 52 différentes cartes dans le constructeur par defaut de ma classe paquetdecarte. (d'où les boucle for et les new, par ailleur dans les membres privés de mon paquetdecarte.h j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const int maxi=52;
     
    class PaquetDeCarte{
          private: 
               Carte* T[maxi]
    en déclenchant le code: cela devrait créer P1 en passant par le constructeur PaquetDeCarte() de mon .cpp que j'ai présenté plus haut,
    je me trompe?

  16. #16
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    J'essaierai ce soit de faire:


  17. #17
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui tu te trompes (désolé :p).

    Comme t'a expliqué Laurent, ce code :
    est une déclaration anticipée d'une fonction exactement comme :
    Si tu veux un objet PaquetDeCarte, il faut enlever les parenthéses.
    Le fait que tu ais des erreurs indique que ta classe a un soucis dans sa définition.

    Peut-être pourrais-tu faire un copier coller des erreurs ?

  18. #18
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    Donc il faut que je fasse?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaquetDeCarte P1 = PaquetDeCarte (); //???
    ou alors:

    utilise t'il le constructeur par défaut??

    Dans mon main.cpp j'ai aussi ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Carte C1 (Deux, pique);
    Cout << C1;
    et sa marche très bien... je ne vois pas la différence, veuillez m'en excuser ^^"

    (pour les erreurs de compilation, je ne pourrais vous les poster que ce soir)

  19. #19
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Les deux marchent.

    Cette solution est la mieux car seul le constructeur par defaut est appellé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaquetDeCarte P1 = PaquetDeCarte (); //???
    Dans cette solution, si ton compilateur n'est pas très malin il peut créer un objet avec le consteur par défaut et appeller le constructeur par copie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Carte C1 (Deux, pique);
    je ne vois pas la différence
    Et bien dans ce code tu passe des arguments, autrement dit des valeurs concretes, il ne peut donc en aucun cas s'agir d'une définition de fonction :

    Celà ne compile pas non plus, j'espère que tu saisis bien la subtilité.

  20. #20
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Points : 92
    Points
    92
    Par défaut
    En effet je pense avoir maintenant compris,

    et d'ailleurs c'est pas ce code qui pose des erreurs, c'est mon affichage,
    et en fait il n'y a qu'une seule erreur, le reste sont des "note" et je n'avais encore jamais vu ça...(même si je suis débutant en programmation)
    pour plus de clarté je vous poste un imprim ecran (j'espere que se sera suffisant car les copier collé sous devC++ sont long...)

    Voici l'image en question:
    http://img221.imageshack.us/img221/4...ilationks3.jpg
    (j'espere que ce n'est pas trop lourd)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème génération d'une énumération.
    Par slopez dans le forum BOUML
    Réponses: 6
    Dernier message: 26/10/2008, 23h42
  2. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  3. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  4. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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