[C] sizeof et variable de structure

sizeof et variable de structure [C] - C - Programmation

Marsh Posté le 02-09-2008 à 17:06:18    

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
Reply

Marsh Posté le 02-09-2008 à 17:06:18   

Reply

Marsh Posté le 02-09-2008 à 17:21:08    

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é!  --
Reply

Marsh Posté le 02-09-2008 à 19:27:02    

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

Reply

Marsh Posté le 02-09-2008 à 20:01:52    

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

Reply

Marsh Posté le 02-09-2008 à 20:11:10    

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

Reply

Marsh Posté le 02-09-2008 à 20:13:22    

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
Reply

Marsh Posté le 03-09-2008 à 09:57:35    

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
Reply

Marsh Posté le 03-09-2008 à 10:04:50    

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)

Reply

Marsh Posté le 03-09-2008 à 10:40:13    

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é!  --
Reply

Marsh Posté le 03-09-2008 à 11:37:17    

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;

Reply

Marsh Posté le 03-09-2008 à 11:37:17   

Reply

Marsh Posté le 03-09-2008 à 11:42:26    

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
Reply

Marsh Posté le 03-09-2008 à 12:07:04    

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

Reply

Marsh Posté le 03-09-2008 à 12:45:02    

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.

Reply

Marsh Posté le 03-09-2008 à 15:38:45    

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
Reply

Marsh Posté le 03-09-2008 à 16:27:50    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed