Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
657 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] sizeof et variable de structure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] sizeof et variable de structure

n°1781533
Facewindu
Posté le 02-09-2008 à 17:06:18  profilanswer
 

Bonjour
Imaginons que j'ai une structure
typedef struct {
   int a;
   int b;
} t_struc;
 
Y a-t-il moyen de connaitre la taille mémoire de a, sans créer inutilement une structure ?
C'est-à-dire faire un truc genre sizeof(t_struc.a) ?
 
merci !


Message édité par Facewindu le 04-09-2008 à 11:40:47
mood
Publicité
Posté le 02-09-2008 à 17:06:18  profilanswer
 

n°1781540
gilou
Modérateur
Modzilla
Posté le 02-09-2008 à 17:21:08  profilanswer
 

Si tu as une variable d'un certain type t, pourquoi ne fais tu pas sizeof(t) ? c.a.d. sizeof(int) dans ton exemple?
Ou alors, je n'ai pas compris ta question.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1781579
Joel F
Real men use unique_ptr
Posté le 02-09-2008 à 19:27:02  profilanswer
 

Essaye ça :
 

Code :
  1. #include <stdio.h>
  2. struct A
  3. {
  4.   int a;
  5.   char b;
  6.   long double c;
  7. };
  8. int main(int,char**)
  9. {
  10.   printf("sizeof(A) = %d\n",sizeof(A) );
  11.   printf("sizeof(A.a) = %d\n",sizeof(A().a) );
  12.   printf("sizeof(A.b) = %d\n",sizeof(A().b) );
  13.   printf("sizeof(A.c) = %d\n",sizeof(A().c) );
  14.   return 0;
  15. }


 
sizeof est purement résolu à la compil. Il va donc chercher à typer A().a snas instancier quoi que ce soit

n°1781583
Un Program​meur
Posté le 02-09-2008 à 20:01:52  profilanswer
 

Solution possible en C++, pas en C (ce qui semble nécessaire à voir le tag et l'utisation d'un typedef inutile en C++)

n°1781586
Joel F
Real men use unique_ptr
Posté le 02-09-2008 à 20:11:10  profilanswer
 

le tag c'est juste que je mets trjrs [cpp] :E
J'ai compilé le truc dans un .c avec gcc 4.x.

n°1781587
Joel F
Real men use unique_ptr
Posté le 02-09-2008 à 20:13:22  profilanswer
 

Mes confuses en effet :
En c :

 
Code :
  1. #include <stdio.h>
  2. struct A
  3. {
  4.   int a;
  5.   char b;
  6.   long double c;
  7. };
  8. typedef struct A toto_t;
  9. #define MEMBER_SIZEOF(Type,Member) (sizeof( ((Type*)(0))->Member ))
  10. int main(int argc,char** argv)
  11. {
  12.   printf("size of A    = %d\n",sizeof(struct A) );
  13.   printf("size of A.a = %d\n", MEMBER_SIZEOF(struct A, a)  );
  14.   printf("size of A.b = %d\n", MEMBER_SIZEOF(struct A, b)  );
  15.   printf("size of A.c = %d\n", MEMBER_SIZEOF(struct A, c)  );
  16.   printf("size of toto_t.c = %d\n", MEMBER_SIZEOF(toto_t, c)  );
  17.   return 0;
  18. }
 

Avec une belle macro en prime :o


Message édité par Joel F le 02-09-2008 à 20:50:04
n°1781740
Facewindu
Posté le 03-09-2008 à 09:57:35  profilanswer
 

ok nickel merci JoelF !
Pour gilou, je voulais savoir la taille d'une variable d'une structure, mais de manière robuste. Càd que si qq'un d'autre que moi modifie le code dont je me sers, et change par exemple le type de ma variable, le code de JoelF marchera quand même.
 
Par contre, pour ma culture du C, ca veut dire quoi (Type*)(0) ?
Je comprends pas trop le principe de la macro.

Message cité 1 fois
Message édité par Facewindu le 03-09-2008 à 10:06:06
n°1781746
Facewindu
Posté le 03-09-2008 à 10:04:50  profilanswer
 

Bon allez de bon matin j'en rajoute une petite couche ;
est-ce que c'est possible de chopper la taille d'une variable de structure du type
struc{
int a:5;
}
 
En gros je voudrais me fabriquer un sizeof qui me renvoit 5 (5bits du coup) et pas 4 (4 octets de l'entier)

n°1781790
gilou
Modérateur
Modzilla
Posté le 03-09-2008 à 10:40:13  profilanswer
 

Ca, je ne crois pas que ce soit possible. Je ne crois pas qu'on aie acces en C a la largeur déclarée d'un bit field.
A+,

Message cité 1 fois
Message édité par gilou le 03-09-2008 à 10:53:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1781845
Joel F
Real men use unique_ptr
Posté le 03-09-2008 à 11:37:17  profilanswer
 

Facewindu a écrit :

ok nickel merci JoelF !
Pour gilou, je voulais savoir la taille d'une variable d'une structure, mais de manière robuste. Càd que si qq'un d'autre que moi modifie le code dont je me sers, et change par exemple le type de ma variable, le code de JoelF marchera quand même.
 
Par contre, pour ma culture du C, ca veut dire quoi (Type*)(0) ?
Je comprends pas trop le principe de la macro.


 
La amcro :
 

Code :
  1. #define MEMBER_SIZEOF(Type,Member) (sizeof( ((Type*)(0))->Member ))
  2. int k = MEMBER_SIZEOF(A,a);


 
se développe ainsi
 

Code :
  1. int k =  (sizeof( ((A*)(0))->a));


 
Pour être évalué, sizeof doit connaitre le TYPE (et seulement le type) de son paramètres.  
Qu'à-t-il à sa disposition :
 
(A*)(0) construit un pointeur vers A qui vaudra 0 à l'exécution.
sur ce pointeur on applique ->a et on demande donc le champ A::a;
 
Au moment de la compilation, sizeof résout le type renvoyé par -> appliqué sur un type A*, donc le type du membre.
A partir de ce type concret, il calcule la taille. A l'exécution, le code exécuté est :
 

Code :
  1. k = 4;

mood
Publicité
Posté le 03-09-2008 à 11:37:17  profilanswer
 

n°1781852
Facewindu
Posté le 03-09-2008 à 11:42:26  profilanswer
 

gilou a écrit :

Ca, je ne crois pas que ce soit possible. Je ne crois pas qu'on aie acces en C a la largeur déclarée d'un bit field.
A+,


Arf, c'est bien dommage. Ca m'oblige donc à spécifier ces valeurs avec des #define, ou dans un fichier de conf, ce qui fait un peu redondance avec le code.
 
Sinon, imaginons  
typedef struct __attribute__ ((packed)) {
 struct sequence {
  unsigned int a:5;
  signed int b:27;
 } ci[255];
} t_struct;
 
J'aimerais chopper le 255
Avec la macro de JoelF, j'ai fait
MEMBER_SIZEOF(t_struct,ci)/MEMBER_SIZEOF(t_asd5_pkt,*ci)
Mais il aime pas le *ci, je vois pas trop pourquoi.
 
Ca ma semble similaire à
int tab[5];
puis sizeof(a)/sizeof(*a)=5 non ?


Message édité par Facewindu le 03-09-2008 à 11:44:41
n°1781881
Joel F
Real men use unique_ptr
Posté le 03-09-2008 à 12:07:04  profilanswer
 

bah le 2e parametres de la macro est le MEMBRE à sizeof'er. *ci n'est pas un membre.Donne les déf. complètes

n°1781923
Facewindu
Posté le 03-09-2008 à 12:45:02  profilanswer
 

J'ai pas compris ce qui te manques JoelF.
typedef struct{
   int val:3;
   int val2;
   struct sequence {
      unsigned int a:5;
      signed int b:27;
   } ci[255];
} t_struct;
 
Voilà en gros ma structure. D'après gilou, y a pas moyen de récupérer le 3 de val.
Par contre avec ta macro, je peux récupérer le 4 qui correspond à val2.
Troisième truc : J'essaie récupérer le 255, qui correspond au nombre d'éléments de ci. (Chaque élément de ci étant une structure {a,b})
Je voulais le faire avec ta macro et sur la base de sizeof(tab)/sizeof(*tab) qui permet de récuperer le nb d'éléments d'un tableau de type quelconque. Mais ça marche pas et je voulais savoir pourquoi.

n°1782100
Joel F
Real men use unique_ptr
Posté le 03-09-2008 à 15:38:45  profilanswer
 

ok, voila :

 
Code :
  1. typedef struct __attribute__ ((packed)) {
  2. struct sequence {
  3.   unsigned int a:5;
  4.   signed int b:27;
  5. } ci[255];
  6. } t_struct;
  7. int main(int argc,char** argv)
  8. {
  9.   printf("sizeof(t_struct) = %d\n",sizeof(t_struct) );
  10.   printf("sizeof(t_struct.ci) = %d\n", MEMBER_SIZEOF(t_struct, ci)  );
  11.   printf("sizeof(t_struct::sequence) = %d\n", MEMBER_SIZEOF(t_struct, ci[0])  );
  12.   printf("sizeof(ci) = %d\n", MEMBER_SIZEOF(t_struct, ci)/MEMBER_SIZEOF(t_struct, ci[0])  );
  13.   return 0;
  14. }
 

faut utiliser ci[0] et non *ci qui n'a pas de sens collé derrière le -> de la macro

 

sizeof n'est de toute façon pas défini sur les bitfield.


Message édité par Joel F le 03-09-2008 à 15:40:27
n°1782163
Facewindu
Posté le 03-09-2008 à 16:27:50  profilanswer
 

ouais, chui bête ci[0] ...
Tant pis pour les bitfields, je vais caser les infos des variables concernées dans un *.h avec des DEFINE, pour que ça soit pas trop chiant à changer, si jamais je devais le faire.
merci bien !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] sizeof et variable de structure

 

Sujets relatifs
variable PHP pour HTML[Resolu][C#, ASP.net / access] problème requete update
C'est la saint florentg!C# comparativement à Java
[C/C++] controller le preprocesseurprogrammation C
Script bash - Problème d'espace dans une variable RESOLUApprendre le C#
[RESOLU] Visual C++ 6.0 : Plantage à la compilation[C#] Recherche LDAP
Plus de sujets relatifs à : [C] sizeof et variable de structure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR