Problème d'alignement de données

Résolu
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 15 déc. 2006 à 18:43
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 16 déc. 2006 à 03:47
J'ai décrit sous forme d'un champ de bit l'en tete des données pour un protocole de communication sans fil basé sur le 802.15.4.

Voici cette description:
typedef struct
{
    unsigned type            : 3;
    unsigned security        : 1;
    unsigned frame_pending    : 1;
    unsigned ack_request    : 1;
    unsigned intra_pan        : 1;
    unsigned                : 1;
    unsigned                : 2;
    unsigned dest_addr_mode    : 2;
    unsigned                : 2;
    unsigned src_addr_mode    : 2;
} FCF_bits;

typedef union
{
    FCF_bits bits;
    PHY_UINT16 val;
    struct
    {
        PHY_UINT8 high;
        PHY_UINT8 low;
    } byte;
} FCF;

Lorsque j'affiche le contenu de cet en tete, je vois 4 octets qui s'affichent alors que j'en attend seulement 2.
J'ai essayer en encadrant le tout de #pragma pack(1) et #pragma pack(), mais rien à faire.

sizeof(FCF_bits) vaut 4. Sauriez-vous pourquoi? (et par la meme occasion, comment résoudre ce problème?)

Merci d'avance.
Vive le C
Savon

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2006 à 23:33
et voila du sizeof = 2

typedef struct _FCF_bits {
  BYTE type            :3;
  BYTE security        :1;
  BYTE frame_pending   :1;
  BYTE ack_request     :1;
  BYTE intra_pan       :1;
  BYTE                 :1;
  BYTE                 :2;
  BYTE dest_addr_mode  :2;
  BYTE                 :2;
  BYTE src_addr_mode   :2;
} FCF_bits;

le type par défaut est int si non précisé donc compilo les range par force à des adresses accessibles sans exception d'alignement.
Avec des membres déclarés 'octet', le prob ne se pose plus car toute adresse sera valide.

ciao...
BruNews, MVP VC++
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
15 déc. 2006 à 23:42
A mon avis c'est a cause du padding (remplissage) des champs non nommés. Ils te font aller au prochain alignement. essayes de les nommer. (pas sur quant même parceque c'est plutot quant on les mets à zero, ex unsigned  : 0;).
Tchao.
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
16 déc. 2006 à 03:47
Merci brunews, effectivement le probleme était bien la.
Vive le C
Savon
0
Rejoignez-nous