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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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