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 :

Erreur : Conflicting types


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut Erreur : Conflicting types
    Bonjour,

    Une petite présentation s'impose : Je suis actuellement étudiant en première année d'école d'informatique, et pour la fin d'année les profs nous ont demandé de créer un petit jeu en C sans nous en dire plus sur la bibliothèque à utiliser ou autre. SDL 1.2 m'a paru la meilleure option pour cela, et un démineur me semblait accessible.

    Dans ce démineur, je crée une carte (pour recenser chaque case), mais je dois faire une erreur dans la déclaration de la structure car une erreur apparaît et je ne sais pas la résoudre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct{                      //Structure carte
        SDL_Rect Case;                 //Contient une surface : Case
        int statut;                         //Son état(mine,dévoilée,cachée,drapeau) : statut
    }Carte[NB_L * NB_H];            //Carte étant un tableau de taille  (nbcase en hauteur * nbcase enlargeur )
    J'ai le droit à un "Conflicting types for Carte"

    J'aimerais quelques explications sur mon erreur histoire de comprendre ce que je fais mal , Merci d'avance

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Un typedef est un alias d'un type vers un autre. Pour faire ce que tu sembles vouloir écrire, il faudrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct{                      //Structure carte
        SDL_Rect Case;                 //Contient une surface : Case
        int statut;                         //Son état(mine,dévoilée,cachée,drapeau) : statut
    }CarteStruct;            
     
    #define Carte CarteStruct[NB_L * NB_H] //Carte étant un tableau de taille  (nbcase en hauteur * nbcase enlargeur )

  3. #3
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Bonjour,

    Avant tout merci de m'avoir répondu aussi vite. Ensuite, je ne comprends pas l'utilisation du #define, cela revient-il à déclarer une variable Carte de type CarteStruct ?

    comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct{                      //Structure carte
        SDL_Rect Case;                 //Contient une surface : Case
        int statut;                         //Son état(mine,dévoilée,cachée,drapeau) : statut
    }CarteStruct; 
     
    CarteStruct Carte[NB_L*NB_H];

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Citation Envoyé par Mmemykon Voir le message
    Avant tout merci de m'avoir répondu aussi vite. Ensuite, je ne comprends pas l'utilisation du #define, cela revient-il à déclarer une variable Carte de type CarteStruct ?
    Effectivement, le #define n'a pas beaucoup de sens dans ce contexte précis.
    Trois remarques sur le fond :

    • Une expression de type struct {} est considérée en elle-même comme un type. Tu n'es donc pas obligé de recourir à typedef pour instancier ta structure. Par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
          int                                 x;
          float                               y;
          struct { int a; int b; int c; }     z;
    • Tu peux également nommer cette structure, ce qui te permet de réinstancier de nouvelles variables sans avoir à la redéfinir, toujours sans typedef :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
          struct plandujeu { int a; int b; int c; }       z1;
          struct plandujeu                                z2;
          struct plandujeu                                z3;
      Ceci est en fait la manière normale d'utiliser les structures. « typedef » est une facilité annexe qui permet effectivement de définir un alias d'un type existant quand celui est trop compliqué (spécialement vrai avec les pointeurs de fonction, par exemple) et comme c'est applicable aux structures comme au reste, ça permet de clarifier le code et de glisser doucement vers la programmation orientée objet.

    • Il faut faire très attention quand tu définis des tableaux multi-dimensionnels de structures. C'est assez courant dans des situations comme la tienne, mais cela devient vite EXTRÊMEMENT gourmand en mémoire. Il n'est pas rare de dépasser la taille de la pile avec des programmes écrits de la sorte, et de déclencher une segmentation fault alors que le programme paraît tout-à-fait correct sur le plan algorithmique.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La raison pour laquelle on utilise souvent un typedef, c'est parce que le type de z1, z2 et z3 dans l'exemple d'Obsidian est struct plandujeu.
    On utiliserait un typedef pour donner un nom plus court, sans le mot clé struct, a priori plandujeu_t ou plandujeu_s (ou dans mon cas personnel, plan_du_jeu_type).

    ainsi, avec un typedef, on aurait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct plandujeu   { int a; int b; int c; };//déclaration du type
    typedef struct plandujeu plandujeu_t;
     
    plandujeu_t z1;
    plandujeu_t z2;
    plandujeu_t z3;
    ou, en version plus dense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct plandujeu { int a; int b; int c; } plandujeu_t;//déclaration du type "struct plandujeu" et de son alias, plandujeu_t
     
    plandujeu_t z1;
    plandujeu_t z2;
    plandujeu_t z3;

  6. #6
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Bonjour Obsidian,

    Merci d'avoir éclairé ma lanterne à propos des structures, une "segmentation fault" me ferait plaisir, je suis pour l'instant bloqué à cause d'une erreur de type "conflicting types", ma première déclaration (cf: premier message) de la structure Carte était elle correcte ? Si oui, pour créer un objet de type Carte une telle déclaration serait-elle correcte ? Encore une fois, merci d'avoir répondu rapidement. Je ne sais pas si je peux me permettre de poster mon code entièrement ( Sachant que je compile avec un main.c, demineur.c et demineur.h ) histoire d'avoir une sorte de "correction" ou encore même des conseils.

  7. #7
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Bonjour leternel,

    Dans ta déclaration, "plandujeu" est-il obligatoire ? Je ne me souviens pas l'avoir "apprit" come cela lors des td, la déclaration se contentait de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct { int a; int b; int c; } plandujeu_t;//déclaration du type "struct plandujeu" et de son alias, plandujeu_t

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

Discussions similaires

  1. Fonction - Erreur : conflicting types
    Par Mélodie_et_rythmes dans le forum C
    Réponses: 12
    Dernier message: 03/05/2012, 11h41
  2. [LG] Erreur de type incompatible dans assignment
    Par Tuxico dans le forum Langage
    Réponses: 4
    Dernier message: 03/12/2005, 21h06
  3. conflicting types
    Par semaj_james dans le forum C
    Réponses: 3
    Dernier message: 28/11/2005, 12h10
  4. erreur Data type mismatch in criteria expression
    Par bachilbouzouk dans le forum ASP
    Réponses: 3
    Dernier message: 20/04/2005, 11h48
  5. [Agents services] Erreur de types imcompatibles
    Par ApollloCrid dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 14/04/2005, 19h47

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