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 "multiple" de headers


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut Problème d'inclusion "multiple" de headers
    Bonjour,

    depuis quelques temps j'essaye de coder proprement et donc de ne plus faire un seul "gros" fichier .h que j'inclus dans chaque .c , mais comme il est conseillé un header par fichier source.

    Voici 2 de mes headers :

    1) param.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
     
    #ifndef __PARAMETRES_H__
    #define __PARAMETRES_H__
     
    #include "app.h"
     
    typedef struct param{
      int resolution[2];
      ...
    } Param;
     
    int fonction(Necessaire *);
     
    #endif
    2) app.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef __APP_H__
    #define __APP_H__
     
    #include "param.h"
     
    typedef struct necessaire{
      ...
      Param opt;
      ...
    } Necessaire;
     
    #endif

    Voilà le problème : je suis obligé d'inclure réciproquement chaque fichier dans l'autre car ma structure "necessaire" contient une structure "param", et dans param.h ma fonction prend en paramètre un pointeur sur une structure "necessaire".

    Et là le compilateur n'aime pas du tout il me sort des erreurs du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    param.h : too many arguments for function "fonction"
    Donc j'aimerai savoir comment résoudre ce problème SANS être obligé de devoir faire un seul .h contenant les deux structures.

    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ce que tu veux faire, c'est une declaration forward (déclarer qu'une structure existe avant qu'elle ne soit définie et en C, je ne sais le faire que de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct A A;
    typedef struct B B;
     
    struct A
    { int member;
      B *ptr;
    };
     
    struct B
    { int member;
      A *ptr;
    };
    Mais peut être qu'il y a d'autres constructions ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tu ne peux faire ça que pour un type qui va être utilisé au travers d'un pointeur, il est impossible d'instancier un type qui n'a pas été pleinement défini.

    Ne peux-tu pas simplement placer le prototype de fonction() ailleurs ? (ton problème me semble plutôt provenir de fichiers mal organisés ; regroupe les structures par thème).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Merci pour vos réponses.

    Oui en effet j'ai lu que la déclaration forward ne marchait qu'à certaines conditions.

    Je pense que je vais devoir changer l'emplacement de mes fonctions. Mais j'ai tout de même pris soin avant de me lancer dans le codage d'organiser par thème justement lol.

    App.c/.h contiennent les fonctions relatives à la fenêtre principale de mon programme (création, destruction,...) et Param.c/.h contiennent toutes les fonctions relatives aux paramètres de mon application (les charger à partir d'un fichier, les enregistrer,...).

    N'existe-t-il pas des "règles" pour bien organiser les fonctions dans un gros programme ?

    On m'a dit qu'il fallait bien séparer la partie graphique du reste mais plus généralement, quelles règles suivez-vous ?

    Merci !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Moi j'ai tendance à faire des "modules" séparés, de telle façon que si A utilise B, B n'ait pas à connaître l'existence de A. J'évite autant que possible d'avoir comme ça des classes qui sont imbriqués dans les deux sens.

    Ici, la présence de fonction() dans param.h me gène un peu (et le compilateur aussi apparemment ? )

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par remram44 Voir le message
    Moi j'ai tendance à faire des "modules" séparés, de telle façon que si A utilise B, B n'ait pas à connaître l'existence de A
    Cela est effectivement la meilleure méthode mais parfois, cela n'est pas possible ou alors cela a un coût en terme de lisibilité et comprehénsion du code.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par remram44 Voir le message
    Moi j'ai tendance à faire des "modules" séparés, de telle façon que si A utilise B, B n'ait pas à connaître l'existence de A. J'évite autant que possible d'avoir comme ça des classes qui sont imbriqués dans les deux sens.

    Ici, la présence de fonction() dans param.h me gène un peu (et le compilateur aussi apparemment ? )

    C'est la meilleur façon de programmer en C, avec des "modules" séparés. Ansi, on pourra se rapprocher de la programmation "Objet", qui plus claire.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je programme surtout en C++.

    NeMo_O, as-tu toujours un problème ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    D'accord merci pour vos réponses, je vois un peu mieux comment organiser les fonctions

    Mais je trouve cela assez compliqué. Etant donné que mon programme utilise des librairies graphiques, quasiment toutes mes fonctions ont besoin de connaître les fonctions graphiques et mon application a besoin de connaître les fonctions de tracé.

    Il y a donc beaucoup d'interdépendances et pour résoudre ça je pourrais juste scinder mon programme en 2 gros fichiers, mais vu le nombre de fonctions il faut que je découpe plus large.

    Si jamais vous avez des gros projets avec des exemples d'organisation des fonctions, je suis preneur !

    En tout cas, c'est résolu j'avais en effet mal organisé mes 2 structures et ça fonctionne

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par NeMo_O Voir le message
    [...]et mon application a besoin de connaître les fonctions de tracé.
    Mais est-ce que les fonctions de tracé ont besoin de connaître en détails le reste de l'application ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    En détail non je ne dirais pas.

    Mais tel que je les ai programmées, elles doivent connaître dans quelle zone de dessin tracer, la dimension de la zone de dessin, et quelques autres paramètres.

    Enfin je crois avoir trouvé la solution : au lieu de passer toute la structure en paramètre, il suffit que je ne passe que le nécessaire et ça devrait aller

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par NeMo_O Voir le message
    Si jamais vous avez des gros projets avec des exemples d'organisation des fonctions, je suis preneur !
    Ca découle directement de l'analyse organique préalable. Ça ne tombe pas du ciel, et surtout, il est quasiment impossible de réorganiser un gros projet qui n'a pas été correctement conçu et découpé au départ... C'est donc une question absolument vitale... Le point clé de l'organisation, ce sont les structures (oui, on est sur le chemin de l'organisation OO, mais je n'en vois pas d'autre)...

    Les ADT peuvent aider :

    http://emmanuel-delahaye.developpez.com/tad.htm

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ça ne tombe pas du ciel, et surtout, il est quasiment impossible de réorganiser un gros projet qui n'a pas été correctement conçu et découpé au départ...
    En effet, je ne pensais pas que mon projet allait être aussi gros à la base, j'ai donc codé ça à la va vite en utilisant tout ce qui était déconseillé du moment que ça marche

    Mais lorsque je devais modifier une petite chose, je me suis vite rendu compte que j'avais codé vraiment mochement lol.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    C'est donc une question absolument vitale... Le point clé de l'organisation, ce sont les structures (oui, on est sur le chemin de l'organisation OO, mais je n'en vois pas d'autre)...

    Les ADT peuvent aider :

    http://emmanuel-delahaye.developpez.com/tad.htm
    Je suis donc tombé sur ton site qui m'a bien appris sur "comment bien coder" :p

    J'ai repris mon programme à partir de 0 et j'ai tout structuré différemment en essayant autant que faire se peu de n'être classé dans aucune catégorie de " l'échelle du goret "

    Dorénavant, je définirai bien mon plan de réalisation avant de coder

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

Discussions similaires

  1. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 03/10/2005, 23h59
  2. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 11h47

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