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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    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 émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    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;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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.
    Si les cons volaient, il ferait nuit à midi.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre éprouvé 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
    Points : 1 132
    Points
    1 132
    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.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    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.

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    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) .
    Non ! sizeof(struct struct1) oui ! sizeof(struct struct2) oui !
    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.
    Non, sizeof(struct struct2) donnera la bonne valeur

    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 :
    La question est plutôt "Pourquoi définir une sous structure qui n'aurait pas besoin d'être visible à l'extérieur de la structure ?"
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct struct1{
        int myInt;
        struct struct2{
        };
    };
     
    sizeof(struct struct2) // ça mon compilateur n'en veux pas
    Ca me parait cohérent. Il suffit de penser que l'on va rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct struct1{
        int myInt;
        struct struct2{
        };
    };
     
    struct struct3{      // debut de rajout
        float myFloat;
        struct struct2{
        };
    };                   // fin de rajout
    sizeof(struct struct2) // le compilateur devrait être perdu
    Pour ce qui est de l'utilité, dans la vraie vie, j'ai la situation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct struct1{
        int myint1;
        struct struct2{
        };
    }mystruct1;
     
    struct struct3{
       int myint2;
       struct1 mystruct1;
    }mystruct3;
    je veux pouvoir copier rapidement le contenu de mystruct1.struct2 dans mystruct3.mystruct1.struct2, c.à.d. via memcpy ; j'ai donc besoin de connaitre le sizeof (mystruct3.mystruct1.struct2), et pour des raisons de légèreté de code j'espérais pouvoir m'affranchir de la référence à une instance lors du sizeof.

  10. #10
    Membre éprouvé 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
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par lpierard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct struct1{
        int myInt;
        struct struct2{
        };
    };
     
    sizeof(struct struct2) // ça mon compilateur n'en veux pas
    Il ni y a pas de raison, qu'elle est l'erreur retournée par ton compilateur au juste ?

    Citation Envoyé par lpierard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct struct1{
        int myInt;
        struct struct2{
        };
    };
     
    struct struct3{      // debut de rajout
        float myFloat;
        struct struct2{
        };
    };                   // fin de rajout
    sizeof(struct struct2) // le compilateur devrait être perdu
    normale qu'il soit perdu tu redéclares (ou redéfinis ? Je m'y perd quand cela touche au struct) struct struct2, l'imbrication est trompeuse tu aurais pu écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct struct2{
    };
     
    struct struct1{
        int myInt;
    };
     
    struct struct3{      // debut de rajout
        float myFloat;
    };
    Citation Envoyé par lpierard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct struct1{
        int myint1;
        struct struct2{
        };
    }mystruct1;
     
    struct struct3{
       int myint2;
       struct1 mystruct1;
    }mystruct3;
    je veux pouvoir copier rapidement le contenu de mystruct1.struct2 dans mystruct3.mystruct1.struct2 ...
    Dit toi que struct struct2{char buf[512];}; n'occupe aucun espace mémoire tandis que struct struct2{char buf[512];} variable; ou alors struct struct2 variable oui.
    il ni y a donc pas de mystruct1.struct2 cela n'a aucun sens.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct struct1 {
      struct {
        int toto;
      } st2;
    };
     
    sizeof( ((struct struct1*)NULL)->st2  )
    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.

+ 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