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 :

confilcting types pour une structure ?


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Points : 148
    Points
    148
    Par défaut confilcting types pour une structure ?
    Voici mon code :
    libproj.h
    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
    #include "libimage.h"
     
    //structures: 
    typedef struct{
    	double rouge;
    	double vert;
    	double bleu;
    } couleur_coef;
     
    /*----------PROTOTYPES DES FONCTIONS DE DIMENSIONNEMENT D'IMAGES--------------*/
    image intersection_image(image im_orig1, image im_orig2);
    image union_image(image im_orig1, image im_orig2);
     
    //---------------FONCTIONS D'OPERATIONS SUR LES POINTS-------------------
    point add_pt(point pt1, point pt2);
     
    //----------------------FONCTIONS DE CONVERSIONS-------------------------
    point conv_coef_en_couleur(couleur_coef coef);
    couleur_coef conv_couleur_en_coef(point pt);
    la stucture de point est parfaitement déclarée dans le include

    gcc me renvoie les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    libproj.h:10: error: conflicting types for 'couleur_coef'
    libproj.h:10: error: previous declaration of 'couleur_coef' was here
    libproj.h:21: error: conflicting types for 'conv_coef_en_couleur'
    libproj.h:21: error: previous declaration of 'conv_coef_en_couleur' was here
    libproj.h:21: error: conflicting types for 'conv_coef_en_couleur'
    libproj.h:21: error: previous declaration of 'conv_coef_en_couleur' was here
    libproj.h:22: error: conflicting types for 'conv_couleur_en_coef'
    libproj.h:22: error: previous declaration of 'conv_couleur_en_coef' was here
    libproj.h:22: error: conflicting types for 'conv_couleur_en_coef'
    libproj.h:22: error: previous declaration of 'conv_couleur_en_coef' was here
    En me renseignant sur les erreurs possibles j'ai cru comprendre que cela pouvait provenir d'une incompatibilité de version entre gcc et libc.

    Mais je ne sais pas quoi faire.

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par Tymk
    Voici mon code :
    libproj.h
    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
    #include "libimage.h"
     
    //structures: 
    typedef struct{
    	double rouge;
    	double vert;
    	double bleu;
    } couleur_coef;
     
    /*----------PROTOTYPES DES FONCTIONS DE DIMENSIONNEMENT D'IMAGES--------------*/
    image intersection_image(image im_orig1, image im_orig2);
    image union_image(image im_orig1, image im_orig2);
     
    //---------------FONCTIONS D'OPERATIONS SUR LES POINTS-------------------
    point add_pt(point pt1, point pt2);
     
    //----------------------FONCTIONS DE CONVERSIONS-------------------------
    point conv_coef_en_couleur(couleur_coef coef);
    couleur_coef conv_couleur_en_coef(point pt);
    la stucture de point est parfaitement déclarée dans le include

    gcc me renvoie les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    libproj.h:10: error: conflicting types for 'couleur_coef'
    libproj.h:10: error: previous declaration of 'couleur_coef' was here
    libproj.h:21: error: conflicting types for 'conv_coef_en_couleur'
    libproj.h:21: error: previous declaration of 'conv_coef_en_couleur' was here
    libproj.h:21: error: conflicting types for 'conv_coef_en_couleur'
    libproj.h:21: error: previous declaration of 'conv_coef_en_couleur' was here
    libproj.h:22: error: conflicting types for 'conv_couleur_en_coef'
    libproj.h:22: error: previous declaration of 'conv_couleur_en_coef' was here
    libproj.h:22: error: conflicting types for 'conv_couleur_en_coef'
    libproj.h:22: error: previous declaration of 'conv_couleur_en_coef' was here
    En me renseignant sur les erreurs possibles j'ai cru comprendre que cela pouvait provenir d'une incompatibilité de version entre gcc et libc.

    Mais je ne sais pas quoi faire.
    Peu-etre bien que le type couleur_coef est déjà déclaré et défini dans libimage.h ? gcc te dit juste que le type est déjà défini.

    Incompatibilité en gcc et libc => sur que non, rien à voir.

    A+

  3. #3
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Hum, j'ai peur que tu n'inclus plusieurs fois ton .h !
    Ajoute quelque-chose comme ça au début et a la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef LIBPROJ_H_
    #define LIBPROJ_H_
    <... ton code ...>
    #endif

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Points : 148
    Points
    148
    Par défaut
    Ca marche.

    Mais je trouve ça magique. Qu'est-ce qui ce passe en fait ?

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Non, ce n'est pas magique


    Exemple simple (qui pourrait être mis dans la FAQ):
    Code header.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef entier int;

    Code appli.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "header.h" /* pour avoir entier */
     
    extern entier multiplie(entier a, entier b);

    [code="appli.c"]#include "appli.h"
    entier multiplie(entier a, entier b) {
    return a*b;
    }

    et le main:
    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "header.h" /* pas necessaire mais bon */
    #include "appli.h"
     
    int main(void) {
        entier x=2;
        entier y=3;
        entier z=multiplie(x,y);
        return 0;
    }

    Quand tu vas compiler main.c, header.h va être "lu" (donc le compilateur saura qu'un entier est un int).
    Quand c'est au tour de appli.h d'être lu, il va retomber sur la même déclaration (typedef), ce qui est interdit (pour éviter d'avoir deux déclarations (différentes)). Le compilateur vera:
    Code gcc -E main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef entier int;
    typedef entier int;
    extern entier multiplication(entier a, entier b);
    int main(void) {
        entier x=2;
        entier y=3;
        entier z=multiplie(x,y);
        return 0;
    }

    Si tu mets des #ifndef APPLI_H_ #define APPLI_H_ .... #endif dans le fichier appli.h, lors de la première inclusion, le symbole APPLI_H_ n'est pas efini, du coup, le symbole APPLI_H_ va être définit et typedef va être "lu".
    Lors de la deuxième inclusion, le symbole APPLI_H_ est toujours défini, et donc le compilateur passe de suite au #endif (et saute donc le deuxième typedef):
    Code gcc -E main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef entier int;
    extern entier multiplication(entier a, entier b);
    int main(void) {
        entier x=2;
        entier y=3;
        entier z=multiplie(x,y);
        return 0;
    }

    Rq: c'est en fait le pre-compilateur qui s'occupe de ça (et gcc -E n'effectue que la pré-compilation (i.e. remplacement des macros, inclusion des headers).

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Points : 148
    Points
    148
    Par défaut
    Je reviens sur ce post pour signaler que je suis familier de cette notion maintenant.

    Merci

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

Discussions similaires

  1. quel est le type pour une image?
    Par kitiara999 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 06/12/2006, 18h07
  2. Réponses: 1
    Dernier message: 28/10/2006, 13h05
  3. [TYPE DE CHAMPS] Quel type pour une primary key ?
    Par guy2004 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 25/03/2006, 12h23
  4. Réponses: 6
    Dernier message: 24/03/2006, 18h24
  5. Réponses: 1
    Dernier message: 09/02/2006, 11h03

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