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 :

typedef imbriqués - comment faire ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 41
    Par défaut typedef imbriqués - comment faire ?
    Bonjour,

    Je coince sur une structure qui doit paraitre simple pour vous, mais je ne vois pas l'erreur :

    J'ai deux typedef inclus dans un autre, puis je déclare une variable structure pointée.

    Ma question :
    Comment atteindre un membre d'une des sous-structure ?

    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
    18
    19
    20
    21
    22
     
    typedef struct _t1 {
    	int	tmp1;
    } _STRUCT1;
     
    typedef struct _t2 {
    	int	tmp2;
    } _STRUCT2;
     
     
    typedef struct _complex {
    	_STRUCT1	t1_data;
    	_STRUCT2	t2_data;
    } _COMPLEX;
     
     
    void * 	pcomplex;
     
    *((_COMPLEX *) pcomplex)->t1_data->tmp1;	/* Marche pas !!! */
    *((_COMPLEX *) pcomplex)->t1_data.tmp1;	/* Marche pas !!! */
    *((_COMPLEX *) pcomplex).t1_data->tmp1;	/* Marche pas !!! */
    *((_COMPLEX *) pcomplex).t1_data.tmp1;	/* Marche pas !!! */
    J'ai loupé quoi ?

    Une init ?
    Le référencement ?
    Je dois déréférencer ?

    Merci pour votre aide.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    La bonne réponse est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((_COMPLEX *) pcomplex)->t1_data.tmp1;
    est un pointeur sur _COMPLEX.

    Tu accèdes à t1_data avec la flèche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((_COMPLEX *) pcomplex)->t1_data
    est une structure de type _STRUCT1.

    Tu accèdes à tmp1 avec le point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((_COMPLEX *) pcomplex)->t1_data.tmp1;
    est un entier. Il n'y a pas lieu de le déréférencer.


    Sinon, il doit y avoir beaucoup plus simple pour définir un nombre complexe...

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Hello,

    Aoyou t'a donné la bonne réponse.

    À part cela, typedef signifie « type definition » (« définition de type ») et sert en fait à créer un alias d'un identifiant de type plus compliqué. Tu ne peux donc pas te retrouver avec des « typedef imbriqués ». Quand tu définis des structures, tu imbriques des instances d'un type qui peut être représenté soit par son identifiant original, soit par l'alias défini avec typedef, mais tu n'imbriques pas les typedef eux-mêmes.

    La raison pour laquelle aucune des formes que tu as essayées n'a fonctionné tient à la priorité des opérateurs. Les opérateurs de portée « . » et « -> » sont prioritaires par rapport à l'opérateur de déréférencement « * ». Par conséquent, à la ligne 22, par exemple, l'étoile portait sur l'expression entière et non sur ce qui s'arrêtait au premier point « . ».

  4. #4
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Quelques petites remarques en vrac qui ne prêtent pas à conséquences :

    TomTom68 : j'imagine que ce bout de code est un cas d'école pour illustrer ton problème, toutefois, et à toutes fins utiles, je me permets un petit conseil :
    Evite les void* autant que possible !
    Et si tu en as vraiment besoin (parfois, on n'a pas le choix), transtype le tout de suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef  ...
     
    void foo ( void * pcomplex ) {
        ((_COMPLEX*)pcomplex)->t1_data.tmp1 ; /* beark ! pas lisible... */
    }
     
    void bar ( void * param ) {
        _COMPLEX * pcomplex = (_COMPLEX*)param ; /* hop ! on se débarrasse au plus vite du void* pas beau */
        pcomplex->t1_data.tmp1 ; /* mmm... comme c'est lisible ! */
    }
    Evidemment la notion de lisibilité est un peu subjective, mais elle me semble très importante.
    Ce n'est que mon avis...

    aoyou :
    Sinon, il doit y avoir beaucoup plus simple pour définir un nombre complexe...
    Je pense que TomTom68 n'avait pas l'intention de définir un nombre complexe. Sa structure "_COMPLEX" n'était probablement qu'un morceau de code simplifié pour nous exposer son problème.

    Obsidian : Je m'excuse de te contredire, mais la ligne 20 était correcte en enlevant la première *.
    Il ne s'agit pas d'un problème de priorité d'opérateur mais simplement d'une erreur de type : on ne peut pas dé-référencer un int.


    voila... c'était le quart d'heure du Schtroumpf à lunettes.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par Captain'Flam Voir le message

    Obsidian : Je m'excuse de te contredire, mais la ligne 20 était correcte en enlevant la première *.
    Il ne s'agit pas d'un problème de priorité d'opérateur mais simplement d'une erreur de type : on ne peut pas dé-référencer un int.
    Effectivement, j'ai été trop vite à mettre tout le monde dans le même panier, mais l'esprit reste le même…

  6. #6
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Billets dans le blog
    1
    Par défaut
    Pourqoi ne pas declarer la variable (instance) pcomplex comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _complexe * pcomplex;
    ca serai plus simple a manipule, tu obtiendra ca
    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
    18
    19
     
    typedef struct _t1 {
    	int	tmp1;
    } _STRUCT1;
     
    typedef struct _t2 {
    	int	tmp2;
    } _STRUCT2;
     
     
    typedef struct _complex {
    	_STRUCT1	t1_data;
    	_STRUCT2	t2_data;
    } _COMPLEX;
     
     
    _complexe * pcomplex;
     
    pcomplex->t1_data.tmp1;

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

Discussions similaires

  1. [WD17] comment faire 2 hlitrecherche imbriqués sur un meme fichier
    Par alex1005 dans le forum WinDev
    Réponses: 5
    Dernier message: 21/06/2013, 08h41
  2. Réponses: 3
    Dernier message: 15/09/2010, 12h17
  3. Comment faire 2 ou 3 listbox imbriqués?
    Par zaoueche dans le forum ASP.NET
    Réponses: 5
    Dernier message: 02/11/2009, 09h48
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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