Problème de bitfields et d'alignement [résolu] - C - Programmation
Marsh Posté le 06-10-2008 à 17:48:37
Oui mais si je remplace
unsigned char stream[ 2 ] = { 0, 0xB0 };
par
unsigned char stream[ 2 ] = { 0, 0x0B };
je n'obtiens pas le résultat attendu, mais ceci :
table_id : 0
section_syntax_indicator : 1
dummy : 1
reserved1 : 2
section_length_hi : 0
Marsh Posté le 06-10-2008 à 17:58:41
Ca me semble pourtat être précisément le résultat à attedre das les deux cas, ce que tu obtiens ...
quand tu déclares tes bitfields, rappelle-toi bien que tu commences par les bits de poids faible. Ce que tu copies dans ta structure au final, c'est ca :
1011 0000 0000 0000
donc tes 4 bits de poids le plus fort valent 0xB comme prévu.
Je ne vois pas comment ca aurait pu se transformer en ca : 0000 1101 0000 0000
Marsh Posté le 06-10-2008 à 18:16:23
Ok, donc tu me dis que pour obtenir ce que je souhaite, il faut que j'inverse mes bits de poids fort et de poids faible dans ma structure ?
En passant de :
Code :
|
à :
Code :
|
C'est bien ça ?
Pour Taz, à partir de "00B0", je veux que ma structure soit remplie de la sorte :
table_id : 0
section_syntax_indicator : 1
dummy : 0
reserved1 : 3
section_length_hi : 0
edit : je voulais dire "0B0" et pas "00B0"
Marsh Posté le 06-10-2008 à 20:45:42
Boulette, je voulais écrire "0B0".
Marsh Posté le 07-10-2008 à 12:54:48
Le C ne définit pas par quel côté un bit field commence. Pour certain compilos les champs déclarés en premier sont les bits de poid faible, pour d'autres (genre xlc) ce sont les bits de poid fort.
Marsh Posté le 07-10-2008 à 13:43:30
Ouais, je pense que c'est vraiment trop peu sûr pour que je mette ça en place.
Pour info, j'ai trouvé la solution. Il faut inverser les champs comme suit :
Code :
|
En gros on dirait que dès que la taille des champs est inférieure à l'octet, il faut inverser l'ordre.
Merci pour votre aide.
Marsh Posté le 07-10-2008 à 18:38:47
mea culpa, je me souvenais d'une page de la msdn (pas celle ci, mais une qui exprimait une idée approchante : http://msdn.microsoft.com/en-us/library/ewwyfdbe.aspx )
mais effectivement, il est écrit noir sur blanc dans le K&R que c'est à la discrétion de l'implémentation
Marsh Posté le 06-10-2008 à 16:37:17
Bonjour,
Je suis en train de mettre au point du code pour parser des tables SI/PSI que je reçois en DVB.
Pour ça, au lieu d'utiliser des masques et des shifts, je voudrais utiliser des bitfields ; voici un exemple simplifié :
Ce que je suis censé obtenir est (0xB0 vaut 10110000 en binaire):
table_id : 0
section_syntax_indicator : 1
dummy : 0
reserved1 : 3
section_length_hi : 0
Le problème est que j'obtiens :
table_id : 0
section_syntax_indicator : 0
dummy : 0
reserved1 : 0
section_length_hi : 0x0B
Je travaille avec Visual Studio 2005.
Est-ce que vous auriez une idée du problème ? C'est un soucis d'alignement ?
Merci d'avance.
Message édité par Riot le 07-10-2008 à 13:44:16
---------------
Be the one with the flames.