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 :

Déclarer un type secret


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut Déclarer un type secret
    Bonjour,

    J'ai un petit problème avec la définition de type en C, j'explique :

    Je voudrais redéfinir un type dans un fichier .h à partir d'un autre type que j'ai également créé, mais je ne veux pas que les utilisateurs de ce type sache "ce qu'il y'a derrière". Or, si je déclare ce type comme la redéfinition d'un pointeur sur une structure, ils savent déjà qu'il s'agit d'un pointeur.

    Comme je ne suis pas sur d'avoir été très clair, voici un exemple (je ne mets volontairement que ce qui est utile) :

    Fichier arbre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef arbre_tmp arbre;
    Fichier arbre.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "arbre.h"
     
    typedef struct {
      int etc...
    } *arbre_tmp;
    Si ce code marchait, je pourrais avoir le type arbre en incluant arbre.h sans savoir du tout ce que c'est que arbre. (Le mieux serait de masquer aussi arbre_tmp, et de faire le typedef struct { } *arbre directement dans arbre.c).

    Si vous avez des idées (ou si vous avez pas compris) je suis à votre disposition.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je recommande la méthode suivante :

    Dans le .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct arbre_tmp {
      int etc...
    };
    Et dans le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct arbre_tmp * p_arbre;
    Il faut ensuite fournir les fonctions permettant de manipuler un arbre en passant un pointeur sur arbre (p_arbre). Les déclarations dans le .h et l'implémentation dans le .c. On appelle cela un type opaque pas "secret" (même si c'est la même chose ...) .

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Merci pour ta réponse, j'ai compris pourquoi mon ancien code ne marchait pas. Je ne voulais pas qu'on puisse savoir que arbre était un pointeur mais tant pis, je crois que je ne vais pas avoir le choix

    Merci et @+

    Le Mérovingien

  4. #4
    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 Le Mérovingien Voir le message
    Merci pour ta réponse, j'ai compris pourquoi mon ancien code ne marchait pas. Je ne voulais pas qu'on puisse savoir que arbre était un pointeur mais tant pis, je crois que je ne vais pas avoir le choix
    On peut cacher tout ce qui est derrière le type (objet opaque ou ADT) :
    mais pas le fait que l'adresse de son instanciation soit obligatoirement stockée dans un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* objet.h : interface */
     
    struct objet;
     
    struct objet *objet_create (void);
    void objet_delete (struct objet *);
     
    etc.
    mais, ça, se sont les règles du C.

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

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2010, 10h50
  2. Déclarer un type en java
    Par chouki dans le forum Général Java
    Réponses: 2
    Dernier message: 24/01/2009, 10h45
  3. Déclarer le type uniqueidentifier
    Par naima2005 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 01/08/2008, 22h14
  4. déclarer un type qui incrémente automatiquement
    Par Elstak dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/07/2008, 10h39
  5. Déclarer le type d'une variable à partir d'un champs
    Par tesweb dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/12/2006, 12h24

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