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 :

Question de base à propos des struct


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Question de base à propos des struct
    Je commence la programation en C je dois créer une struct et une struct incluant une autre struct. Le prof a donné du code, mais pour une raison que j'ignore j'ai un message d'erreur : erreur: conflicting types for 'Adresse'

    Je suis coincé, j'ai envoyé un mail au prof (il y a 5 jours), pas de réponse


    Voici mon fichier nommé : Adresse.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
     
    #define TAILLE_NOM_ADRESSE 50
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdlib.h>
     
     
    typedef struct
    {
    	int etage;
    	int noCivic;
    	char rue[TAILLE_NOM_ADRESSE];
    	char ville[TAILLE_NOM_ADRESSE];
    } Adresse;
    Voici mon fichier Personne.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define TAILLE_CHAINE 50
    #include<stdio.h>
    #include <stdlib.h>
    #include "Adresse.h"
     
     
    typedef struct
    {
    	char nom[TAILLE_CHAINE];
    	char prenom[TAILLE_CHAINE];
    	Adresse adresse;
    }Personne;
    Voici mon fichier recenssement.c

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "Adresse.h"
    #include "Personne.h"
     
    #include <string.h>
     
    int main()
    {
    	Adresse test1;
            Personne test2;
     
    	return 0;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Le problème vient du fait que tu inclues en tout deux fois le contenu du fichier Adresse.h
    Une fois directement avec #include "Adresse.h", et une autre fois indirectement par l'inclusion de Personne.h qui lui-même possède cette ligne.
    La structure Adresse est donc redéfinie, et c'est ce qui te donne cette erreur.

    Afin d'éviter cette redéfinition, on prend pour habitude d'insérer dans les fichiers d'entête les macros #ifndef / #define / #endif.

    Remarque : Les autres inclusions stdlib.h / stdio.h / string.h sont ici complètement inutiles, qui plus est dans les fichiers d'entête.

    Ainsi Adresse.h et Personne.h deviennent :
    Code Adresse.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef ADRESSE_H
    #define ADRESSE_H
     
    #define TAILLE_NOM_ADRESSE 50
     
    typedef struct
    {
    	int etage;
    	int noCivic;
    	char rue[TAILLE_NOM_ADRESSE];
    	char ville[TAILLE_NOM_ADRESSE];
    } Adresse;
     
    #endif
    Code Personne.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #ifndef PERSONNE_H
    #define PERSONNE_H
     
    #define TAILLE_CHAINE 50
     
    #include "Adresse.h"
     
    typedef struct
    {
    	char nom[TAILLE_CHAINE];
    	char prenom[TAILLE_CHAINE];
    	Adresse adresse;
    }Personne;
     
    #endif

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Pour détecter cette erreur, tu aurais par exemple pu essayer de générer la sortie du préprocesseur pour ce code. Sous gcc, tu peux utiliser l'option -E. Sortie pour ledit code :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    [...]
     
    # 10 "Adresse.h" 2
     
    typedef struct
    {
     int etage;
     int noCivic;
     char rue[50];
     char ville[50];
    } Adresse;
    # 4 "test.c" 2
    # 1 "Personne.h" 1
     
    # 1 "Adresse.h" 1
    # 13 "Adresse.h"
    typedef struct
    {
     int etage;
     int noCivic;
     char rue[50];
     char ville[50];
    } Adresse;
    # 7 "Personne.h" 2
     
    typedef struct
    {
     char nom[50];
     char prenom[50];
     Adresse adresse;
    }Personne;
    # 5 "test.c" 2
     
    int main()
    {
     Adresse test1;
            Personne test2;
     
     return 0;
    }
    On voit bien que la structure Adresse est définie deux fois. Pour compléter le principe des gardes contre l'inclusion infinie, une autre méthode qui est utilisée (en plus, elle a d'autres usages) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define TAILLE_NOM_ADRESSE 50
     
    #if !defined ADRESSE_STRUCT
    #define ADRESSE_STRUCT
     
    typedef struct
    {
    	int etage;
    	int noCivic;
    	char rue[TAILLE_NOM_ADRESSE];
    	char ville[TAILLE_NOM_ADRESSE];
    } Adresse;
     
    #endif
    Redéfinir une macroconstante deux fois de la même manière est autorisé, mais ce n'est pas le cas d'une structure.

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/04/2011, 12h05
  2. [haxe] question de newbie à propos des sprites
    Par cowboydeluxe dans le forum Flash/Flex
    Réponses: 3
    Dernier message: 05/04/2009, 05h43
  3. [W3C] Question de curiosité à propos des balises non cross-browser
    Par chuckey dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 22/03/2009, 20h04
  4. [Langage] question bête a propos des enum
    Par gronaze dans le forum Langage
    Réponses: 7
    Dernier message: 06/10/2008, 19h38
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

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