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 :

taille d'une structure "cachée"


Sujet :

C

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut taille d'une structure "cachée"
    Bonjour,

    une petite question me taraude depuis un moment, et je n'ai pas réussi à la résoudre seul. Voilà ma question :

    Dans un soucis de coder proprement, je souhaite coder des modules qui utilisent des structures, en cachant l'implémentation de ces structures.

    Exemple, dans le module truc.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef _TRUC_H_
    #define _TRUC_H_
     
    typedef struct truc *truc;
    truc new_truc(int i,int j);
    void delete_truc(truc t);
     /* ... */
     
    #endif
    fichier truc.c :

    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
    17
     
    #include "truc.h"
     
    struct truc {
     int i,j;
    }
     
     
    void truc new_truc(int i,int j) {
      /* malloc */
    }
     
    void delete_truc(truc t) {
      /* free */
    }
     
     /* ... */
    tout marche bien, mais impossible bien sûr d'utiliser l'allocation automatique, car on ne connait pas la taille d'une structure de type "truc". Cela complique désespérément tout, car il faut faire plein de malloc et de free, vérifier la mémoire, on se croirait en c++ (non ce n'est pas un troll, le C++ est, je trouve, bien plus compliqué que le C).

    Y a-t-il un moyen de dire au compilateur que "truc" est une structure de la taille par exemple de deux int, mais sans que l'utilisateur du module ne puisse connaître ces champs ?

    Ma question est peut-être futile, mais quelle est la meilleur approche pour cacher l'implémentation d'une structure à un utilisateur externe ? Est-il acceptable que celui-ci puisse modifier des champs sans passer par des fonctions propres aux modules (on s'éloigne du coup de l'approche objet, et on perd en évolutivité) ?

    Merci pour vos réponses !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Tu veux plutôt dire que tu ne peux pas faire deux tableaux, non?

    Car tu as presque tout le temps de l'allocation dynamique, quand tu bosses avec des pointeurs de types opaques...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    ce que tu veux faire est impossible...

    Opacifier une structure, c'est à dire ne l'utiliser qu'a travers un pointeur sur celle ci sans que sa définition soient publique entraine obligatoirement une allocation dynamique de celle ci au sein de ton module ( à moins que tu ne gère dans le source de ton module une variable statique ou un tableau statique de structure, ce qui est une très mauvais idée)
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Membre confirmé Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    Tu peux aussi faire dans ton API une fonction d'allocation et de free de ta structure et exporter ces fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    truc *pt = truc_alloc();
    [...]
    truc_free(pt);
    pt = NULL;

Discussions similaires

  1. Problème de taille d'une structure
    Par malikben83 dans le forum Débuter
    Réponses: 4
    Dernier message: 08/02/2010, 19h39
  2. Réponses: 11
    Dernier message: 24/04/2008, 13h15

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