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'inclusion circulaire


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Problème d'inclusion circulaire
    J'ai un petit soucis d'inclusion dans un projet.

    En gros, pour ceux que ça intéresse, c'est une appli serveur pour pouvoir jouer à des jeux PBEM sans utiliser le mail. A mon sens, les emails ne sont pas fait pour ça, je voulais y remédier.

    Le message d'erreur que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ make rebuild
    gcc -c ziggy.c -o ziggy.o -W -Wall -Wunreachable-code -Wwrite-strings -Wextra --debug -DDEBUG
    In file included from server.h:21:0,
                     from ziggy.c:26:
    manage.h:31:17: error: array type has incomplete element type
    make: *** [ziggy.o] Erreur 1
    J'ai réduit les structures pour ne garder que les éléments qui posent problème :

    server.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
     
     15 #ifndef DEF_SERVER
     16 #define DEF_SERVER
     ...
     21 #include "manage.h"
     ...
     31 struct _client {
     32     /* socket related */
     ...
     37     /* engine */
    ...
     40     struct _game* game;
     41     struct _client* opponent;
     42 };
     ...
     48 #endif
    manage.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 #ifndef DEF_MANAGE
     16 #define DEF_MANAGE
     ...
     25 #include "server.h"
     ...
     30 struct _game {
     31     struct _client client[2];
     32     char* game;
     33     char* module_name;
     34     struct _module module;
     35 }
    ...
     47 #endif
    J'ai tenté de résoudre le problème en ajoutant un
    avant la déclaration de ma structure _game, mais ça n'a rien changé.

    J'ai beau chercher, je ne vois pas du tout comment résoudre ce problème. Pourriez-vous m'indiquer la marche à suivre pour que je puisse compiler cet ensemble de structure ?

    Et si au passage vous auriez une explication sur le problème, ça m'éviterais de le reproduire par la suite.

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Dans la boucle (si c'est bien une inclusion circulaire mais ça y ressemble effectivement) des .h, as-tu toujours besoin de connaitre la structure de l'autre ? En clair as-tu par exemple dans server.h une fonction qui retourne un _game* ou qui en prend un en paramètre ? Si au contraire, tu ne t'en sers que pour les calculs internes, alors inclue un a.h dans un b.c et définie ta structure dans b.c, en plus c'est "une bonne pratique" . tu fais ensuite ton typedef de ta structure dans le b.h correspondant.
    Exemple :
    server.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    15 #ifndef DEF_SERVER
     16 #define DEF_SERVER
     ...
    typedef stuct _client client;//si manage.h inclue server.h il connait le type client
     ...
     48 #endif
    server.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     20 #include "server.h"
     21 #include "manage.h"//on évite l'inclusion circulaire
     ...
     31 struct _client {
     32     /* socket related */
     ...
     37     /* engine */
    ...
     40     struct _game* game;
     41     struct _client* opponent;
     42 };
    Si cette solution n'est pas possible tu peux aussi fusionner les deux .h.

    Bon courage

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Avant la définition de struct _game, on doit connaitre celle de struct _client, sinon la taille de la struct _game ne peut pas être déterminée par le compilateur.

    Par contre, avant la définition de struct _client, on n'a pas besoin de connaitre celle de struct _game puisque seul un pointeur est utilisé.

    On a donc besoin de l'include "server.h" dans manage.h, mais pas de celui de "manage.h" dans server.h (à moins que d'autres définitions de manage.h soient nécessaires, ce que le code présenté ne dit pas).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Merci de votre aide.
    J'avais déplacé les déclaration de ces structures dans un header commun et séparé, mais a me posait quelques problèmes dans la structure de mes fichiers : le compilo s'y retrouvais, mais plus moi.

    J'ai déplacé les déclarations qui posaient problème avant l'inclusion des fichiers les utilisant et tout passe nickel.

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

Discussions similaires

  1. [MFC] Problèmes d'inclusion d'une DLL
    Par CaptnB dans le forum MFC
    Réponses: 1
    Dernier message: 12/05/2006, 18h01
  2. Réponses: 2
    Dernier message: 25/04/2006, 17h08
  3. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 03/10/2005, 23h59
  4. Problème d'inclusion de pages.
    Par julien85 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 01/05/2005, 18h06
  5. Problème d'inclusion
    Par degreste dans le forum MFC
    Réponses: 5
    Dernier message: 27/01/2004, 00h56

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