Problème d'alignement de données

[Résolu]
Signaler
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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.
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
13
Merci brunews, effectivement le probleme était bien la.
Vive le C
Savon