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 :

implementer une struct dans un .c


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Par d�faut implementer une struct dans un .c
    Bonjour,

    Je voudrai pouvoir creer un module possedant une structure Reseau seulement visible dans la partie priv�e de ce module (le .c). Voici mes fichiers (simplifi�s au maxi)

    reseau.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef RESEAU_H
    #define RESEAU_H
     
    typedef struct Reseau Reseau;
     
    #endif
    reseau.c
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #include "reseau.h"
     
    struct Reseau {
      int **r;
      int nb;
    };
    main.c
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "reseau.h"
     
    int main(int argc,char** argv){
      Reseau *r;
      /* erreur de compilation sur cette ligne : dereferencing pointer to     incomplete type */
      r->nb=2;  
      return 0;
    }
    le module reseau compile, mais il ne veut pas creer main.o
    Quelqu'un aurait il une id�e ?

  2. #2
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    typedef struct Reseau Reseau;
    Le nom de la structure et le nom de la variable doivent �tre diff�renci�e !

  3. #3
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Par d�faut
    Le nom de la structure et le nom de la variable doivent �tre diff�renci�e !
    je viens de tester et �a ne change rien

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par d�faut
    C'est du C...

    ne pas oublier d'initialiser

  5. #5
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Par d�faut
    Citation Envoy� par Ti-R
    C'est du C...

    ne pas oublier d'initialiser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Reseau {
      ...
    };
     
    typedef struct Reseau Reseau;
     
    ...
    Reseau r;
    je ne vois aucun probl�me avec �a

  6. #6
    Membre �clair�
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Par d�faut
    moi ce que je fais d'habitude :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .h on met
     
    typedef struct
    {
     
    } Reseau;
     
    .c on met
     
    typedef struct
    {
      Reseau * Obj;
      ...
    } ExtendedReseau;
    Et a chaque fois que dans une fonction on me passe Reseau, je le cast en ExtendedReseau. Par contre cela necessite que l'appelant appelle une de tes fonctions pour initialiser le Reseau.

    exemple :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    DWORD Reseau_Start(Reseau ** Obj);

  7. #7
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Par d�faut
    barthelv :
    Ce que tu fais est pas mal mais ce que je voudrai savoir c'est si il est
    possible de ne declarer que le nom de la structure dans le .h et l'implementation dans le .c sans se prendre des erreurs de compil des que j'essaie d'acceder aux attributs de ma structure dans le main.

    Si quelqu'un pouvait m'eclairer a ce sujet �a serait vraiment cool

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ing�nieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Hauts de Seine (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par d�faut
    A ajouter dans le .h ?
    Mais la je suis limite sur les sp�cifications pur C... vu que ma sp�cialit� est le C++

    Le gros probl�me est que ton compilateur lorsqu'il inclus ton .h ne trouve pas ta structure, aucune r�f�rence dessus... � par le typedef qui red�fini le type... mais qui indique en rien que ta structure se trouve dans le .c

    Mot cl� extern � ajouter devant�

  9. #9
    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 Ti-R
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    typedef struct Reseau Reseau;
    Le nom de la structure et le nom de la variable doivent �tre diff�renci�e !
    Aucune importance en C. En plus, ici, ce n'est pas une variable, mais un alias (typedef)

  10. #10
    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 Re: implementer une struct dans un .c
    Citation Envoy� par jamal
    Je voudrai pouvoir creer un module possedant une structure Reseau seulement visible dans la partie priv�e de ce module (le .c). Voici mes fichiers (simplifi�s au maxi)

    reseau.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef RESEAU_H
    #define RESEAU_H
     
    typedef struct Reseau Reseau;
     
    #endif
    Interface de donn�es opaques. Ok.
    reseau.c
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #include "reseau.h"
     
    struct Reseau {
      int **r;
      int nb;
    };
    D�finition interne des donn�es. OK

    main.c
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "reseau.h"
     
    int main(int argc,char** argv){
      Reseau *r;
      /* erreur de compilation sur cette ligne : dereferencing pointer to     incomplete type */
      r->nb=2;  
      return 0;
    }
    2 erreurs fondamentales.
    • Le pointeur 'r' n'est pas initialis�. D�r�fr�rencer un pointeur non initialis� entraine un comportement ind�fini.
    • le type Reseau �tant opaque, on ne peut �videmment pas acc�der � ses �l�ments directement. C'est le but de la manoeuvre!

    Avant d'aller plus loin, je te conseille vivement une lecture approfondie de cet article. N'h�site pas � poser des questions si tu ne comprends pas.

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

  11. #11
    Membre averti
    Inscrit en
    Mars 2003
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Par d�faut
    Emmanuel Delahaye:
    Merci pour ce lien tr�s instructif j'aurai du y penser si je cache la structure
    c'est pas pour qu'on puisse acc�der aux �l�ments nimporte ou.

    le type Reseau �tant opaque, on ne peut �videmment pas acc�der � ses �l�ments directement. C'est le but de la manoeuvre!
    En effet tout est dit la dedans ...

    Merci

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 03/12/2012, 19h26
  2. D�claration d'une struct dans une fonction?
    Par fleg666 dans le forum D�buter
    R�ponses: 7
    Dernier message: 24/01/2011, 11h47
  3. MAJ d'une STRUCT dans une PROC
    Par pfo69 dans le forum x86 32-bits / 64-bits
    R�ponses: 3
    Dernier message: 08/04/2009, 17h23
  4. passer unee struct dans un buffer (char *)
    Par baert dans le forum C++
    R�ponses: 2
    Dernier message: 20/02/2006, 21h49
  5. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    R�ponses: 17
    Dernier message: 29/11/2004, 17h43

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