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

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    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 émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    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 : 852
    Points : 2 298
    Points
    2 298
    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
    Futur Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    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 sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    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;
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    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
    Futur Membre du Club
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    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

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, dans ce cas, tu déclares un type non nommé, et un alias.

    Ca marche tout à fait, mais tu n'as pas d'autre possibilité que d'utiliser l'alias.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Pouvez-vous m'aider pour la suite ? Encore une erreur qui me laisse perplexe. Dans mon demineur.h je déclare ma variable Carte et un prototype comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct {                                     //Structure carte
        SDL_Rect Case;                                   //Contient une surface : Case
        int statut;                                      //Son état(0=cachée,1=révélée,2=mine,3=drapeau)
    }CarteStruct;                                        //Carte étant un tableau de taille  (nbcase/hauteur * nbcase/largeur )
     
    CarteStruct Carte;
     
    void creation_carte(CarteStruct);
    Ensuite dans mon demineur.c je déclare la fonction telle que :

    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
    void creation_carte(Carte)
    {
     
        int ix, jy, z=0;
     
        for(jy=0 ; jy <NB_H ; jy++)                                         //On va maintenant remplir cette structure carte
        {                                                                   //On parcourt les colonnes, puis les lignes
            for(ix=0 ; ix<NB_L ; ix++)
            {
                Carte[z].Case.x =(ix*SCASE);                                  //On définit la taille de chaque case,ainsi que son origine
                Carte[z].Case.y =(jy*SCASE);
                Carte[z].Case.h =(SCASE);
                Carte[z].Case.w =(SCASE);
                Carte[z].statut =0;                                        //On la déclare comme étant une case cachée
                z++;
            }
        }
     
    }
    Or je rencontre ces erreurs : "Argument type does not match prototype" et "subscripted values is neither array nor pointer nor vector" ( cette dernière s'appliquant aux lignes où j'utilise "Carte[z].case.x = [...]" )

    Ces erreurs me rendent confus, j'ai essayé de résoudre la deuxième en remplaçant les "." par des "->" , mais rien n'y fait.

    Merci d'avance

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

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    J'ai réussi à résoudre les problèmes de "Argument doesn't match prototype" , il suffisait de respécifier le type de l'argument dans la fonction dans le demineur .c

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Merci de cliquer en bas de page si vos problèmes sont effectivement résolus (voir pourquoi ici http://club.developpez.com/regles/#LIV-M).

    Merci.

+ 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