sizeof et variable de structure [C] - C - Programmation
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+,
Marsh Posté le 02-09-2008 à 19:27:02
Essaye ça :
Code :
|
sizeof est purement résolu à la compil. Il va donc chercher à typer A().a snas instancier quoi que ce soit
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++)
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.
Marsh Posté le 02-09-2008 à 20:13:22
Mes confuses en effet :
En c :
Code :
|
Avec une belle macro en prime
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.
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)
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+,
Marsh Posté le 03-09-2008 à 11:37:17
Facewindu a écrit : ok nickel merci JoelF ! |
La amcro :
Code :
|
se développe ainsi
Code :
|
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 :
|
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. |
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 ?
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
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.
Marsh Posté le 03-09-2008 à 15:38:45
ok, voila :
Code :
|
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.
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 !
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