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 :

sizeof et sous struct implicite imbriquée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut sizeof et sous struct implicite imbriquée
    Bjr à tous.

    Voila mon petit problème de syntaxe C (qui se pose en VS 2008).

    Le contexte technique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
    struct struct2{
    };
    };
    Le problème :
    L'appel sizeof( struct1) fonctionne correctement. Je n'arrive pas à trouver la bonne syntaxe pour l'appel de sizeof sur la sous-structure struct2.
    J'ai bien conscience que l'on peut régler le problème en typant struct2 à l'extérieur de struct1, mais je voudrais l'éviter.

    L'esprit du programmeur :
    Moins on tape de code le mieux c'est ... Ce qui explique la phrase précédente.

    Le contexte :
    J'ai perdu mon K&R, je n'ai donc pas les moyens de voir si mon problème se situe à l'extérieur de la 'norme' ou pas.

    Merci de votre attention.

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    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
    #include <stdio.h>
     
    struct struct1
    {
       char * toto;
       struct struct2
       {
          int tab[4];
       }
       tata;
    };
     
    int main(void)
    {
       struct struct1 st1;
       printf("%zu\n", sizeof st1.tata);
     
       return 0;
    }

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Nao,
    Citation Envoyé par lpierard Voir le message
    L'esprit du programmeur :
    Moins on tape de code le mieux c'est ... Ce qui explique la phrase précédente.
    Et c'est aussi comme ça qu'on en arrive à du code illisible, avec tous les inconvénients qui vont avec.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Merci à nicolas sitbon et à droggo pour leur attention et leur patience.

    Après avoir réglé mon problème, je résume la situation telle que je l'ai comprise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct struct2{
        };
    };
    => dans une telle déclaration on peut faire un sizeof( struct1) mais pas de struct2, par contre si conformément à la suggestion de nicolas je code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct{
        }struct2;
    };
    sizeof( struct1) et sizeof( struct1.struct2) fonctionnent tous les deux.

    N.B.
    1) les deux déclarations contiennent le même nombre de caractères, l'une est souple, l'autre est semi-rigide.
    2) Nicolas rappelle implicitement dans son exemple que sizeof est un opérateur unaire : les parenthèses peuvent être omises, dans certains cas tout du moins.

    Commentaire amical pour droggo :
    "Ce n'est pas parce que je nomme quelque chose 'une rose' que cette chose est une rose et qu'elle sent bon ..." : la qualité du nommage me semble la première garantie d'une bonne lisibilité. Cela n'interdit pas la concision, bien au contraire ...

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct struct2{
        };
    };
    dans une telle déclaration on peut faire un sizeof( struct1) mais pas de struct2,...
    Je ne vois pas pourquoi il ya problème à obtenir sizeof(struct struct1) et sizeof(struct struct2).

    La solution proposée par nicolas.sitbon est une approche différente du problème puiqu'elle passe par la création d'une instance de struct struct1.

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par lpierard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct struct2{
        };
    };
    => dans une telle déclaration on peut faire un sizeof( struct1) mais pas de struct2 ...
    sizeof(struct struct1) ainsi que sizeof(struct struct2) sont valides.

    Citation Envoyé par lpierard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct{
        }struct2;
    };
    sizeof( struct1) et sizeof( struct1.struct2) fonctionnent tous les deux.
    Non c'est sizeof(struct struct1), concernant la deuxième structure elle n'est pas nommée donc on ne peut pas connaître sa taille directement ni l'instanciée.

    Citation Envoyé par lpierard
    Nicolas rappelle implicitement dans son exemple que sizeof est un opérateur unaire : les parenthèses peuvent être omises, dans certains cas tout du moins.
    Oui les parenthèses sont obligatoires autour d'un nom de type.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Merci à tous pour vos remarques.
    Je dois corriger mes assertions un peu hâtives

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct struct2{
        };
    };
    avec une telle déclaration un sizeof( struct1) est ok mais pas sizeof( struct1.struct2) .

    Si je code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct struct1{
        struct{
        }struct2;
    };
    avec une telle déclaration un sizeof( struct1) est ok mais toujours pas sizeof( struct1.struct2) .

    Cependant si je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct1* pStruct1;
    sizeof( pStruct1->struct2);
    le sizeof fonctionne pour la récupération de la taille de la sous-structure. (c'est une situation semblable que j'ai indiqué comme réglée).
    N.B. l'instanciation (via pointeur ou pas) dans le cas de la première déclaration imbriquée ne règle rien.

    Conclusion(s)
    1) Il me faut bien une instanciation (voire à minima, sous forme de pointeur sur la structure) pour obtenir la taille de la sous-structure.
    2) Peut être s'agit-il là d'une erreur propre à M$ ... Pas d"autre compilo sous la main pour vérifier.
    3) Pour connaitre la taille de la sous-structure en évitant toute instanciation, il faut donc déclarer la sous-structure comme une structure à part entière, puis la référencer dans la structure principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct2{
    };
    struct1{
        struct2 Asctruct2;
    };
    Merci qui ??? Merci K&R (Je suis méchant, c'est leur bouquin qui m'a appris le C ... )

    Droggo s'amusera peut-être de la tournure de cette histoire.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/04/2008, 09h59
  2. requète de sélection imbriqué sous access
    Par fahmichebaane dans le forum Access
    Réponses: 3
    Dernier message: 07/04/2006, 11h30
  3. Remplacer une query imbriqué sous mySQL 4.01
    Par brousaille dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/01/2006, 19h33
  4. Requete imbriqué sous delphi avec SGBD oracle accepté ?
    Par EssaiEncore dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/09/2005, 09h55
  5. Structs imbriquées
    Par BigBenQ dans le forum C++
    Réponses: 6
    Dernier message: 07/09/2005, 10h04

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