OVH Cloud OVH Cloud

problème de longueur de structure

7 réponses
Avatar
fredPPP
Bonjour
j'ai un problème de longueur de structure en visual C++

typedef struct {
unsigned char A :3;
unsigned char B:6;
unsigned char C: 3;
unsigned char D: 1;
unsigned char E:1 ;
} tS;
Le compilateur ne me met pas les bits à la suite ( il doit y avoir de bits
de bourrage)
si le champ B contient 5 bits ca marche ( sizeof (tS) vaut 2) mais si le
champs B a 6 bit ca marche pas
( sizeof (tS) vaut alors 3)
comment faire pour forcer le compilateur a mettre les champs a la suite ?

7 réponses

Avatar
Tobias Oed
fredPPP wrote:

[toppost corrige]


"Richard Delorme" a écrit dans le message de news:
3f0ad688$0$9624$
fredPPP a écrit:

Bonjour
j'ai un problème de longueur de structure en visual C++

typedef struct {
unsigned char A :3;
unsigned char B:6;
unsigned char C: 3;
unsigned char D: 1;
unsigned char E:1 ;
} tS;
Le compilateur ne me met pas les bits à la suite ( il doit y avoir de
bits


de bourrage)
si le champ B contient 5 bits ca marche ( sizeof (tS) vaut 2) mais si
le


champs B a 6 bit ca marche pas
( sizeof (tS) vaut alors 3)
comment faire pour forcer le compilateur a mettre les champs a la suite
?



Un compilateur est tétu et fait ce qu'il veut, et aucune solution ne
marche

à coup sûr de partout.
Néanmoins tu peux essayer d'éviter qu'un champs de bits doivent se couper
entre deux mots :
- soit en changeant l'ordre des champs :
typedef struct {
unsigned char A:3;
unsigned char C:3;
unsigned char B:6;
unsigned char D:1;
unsigned char E:1;
} tS;
- soit en utiliseant unsigned short :
typedef struct {
unsigned short A:3;
unsigned short B:6;
unsigned short C:3;
unsigned short D:1;
unsigned short E:1;
} tS;

--
Richard


Le changement d'ordre des champs marchent ,malheureusement ,comme je
traitre des données venant d'un microcontroleur, je ne suis pas maitre de
celles ci, Le unsigned short donne le même résultat que le unsigned char


Utiliser des champs de bits pour ce genre de trucs est assez dangereux. As
tu pense a utiliser un unsigned short et des masques? Avec quelques macros,
tu devrais pouvoir faire qqu chose de relativement portable.

#define GET_MICRO_REG_A(reg) (reg & 0x3)
#define GET_MICRO_REG_B(reg) ((reg & (0x3F << 2)) >> 2)

etc..

Tobias.

--
unix http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.programmer.html
clc http://www.eskimo.com/~scs/C-faq/top.html
fclc (french): http://www.isty-info.uvsq.fr/~rumeau/fclc/



Avatar
fredPPP
Le changement d'ordre des champs marchent ,malheureusement ,comme je traitre
des données venant d'un microcontroleur, je ne suis pas maitre de celles ci,
Le unsigned short donne le même résultat que le unsigned char



"Richard Delorme" a écrit dans le message de news:
3f0ad688$0$9624$
fredPPP a écrit:

Bonjour
j'ai un problème de longueur de structure en visual C++

typedef struct {
unsigned char A :3;
unsigned char B:6;
unsigned char C: 3;
unsigned char D: 1;
unsigned char E:1 ;
} tS;
Le compilateur ne me met pas les bits à la suite ( il doit y avoir de
bits


de bourrage)
si le champ B contient 5 bits ca marche ( sizeof (tS) vaut 2) mais si
le


champs B a 6 bit ca marche pas
( sizeof (tS) vaut alors 3)
comment faire pour forcer le compilateur a mettre les champs a la suite
?



Un compilateur est tétu et fait ce qu'il veut, et aucune solution ne
marche

à coup sûr de partout.
Néanmoins tu peux essayer d'éviter qu'un champs de bits doivent se couper
entre deux mots :
- soit en changeant l'ordre des champs :
typedef struct {
unsigned char A:3;
unsigned char C:3;
unsigned char B:6;
unsigned char D:1;
unsigned char E:1;
} tS;
- soit en utiliseant unsigned short :
typedef struct {
unsigned short A:3;
unsigned short B:6;
unsigned short C:3;
unsigned short D:1;
unsigned short E:1;
} tS;

--
Richard



Avatar
AG
AG wrote:
certains compilo ont des options qui permettent d'éviter les bits de
bourrage. Pour le tient, une question sur un newsgroup dédié à Visual
C++ te permettrait d'avoir la réponse. (a défaut de chercher dans le
manuel)
ça doit être l'option /Zp.


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "fredPPP" wrote:

j'ai un problème de longueur de structure en visual C++

typedef struct {
unsigned char A :3;
unsigned char B:6;
unsigned char C: 3;
unsigned char D: 1;
unsigned char E:1 ;
} tS;


Un champ de bits, ok. Le langage C exige que le type soit 'int' ou 'unsigned
int'. 'unsigned char' ne convient pas. (Ou alors ce n'est plus du C)

Le compilateur ne me met pas les bits à la suite ( il doit y avoir de bits
de bourrage)


Le compilateur fait ce qu'il veut. Le langage C ne définit pas de contraintes
de cet ordre.

si le champ B contient 5 bits ca marche ( sizeof (tS) vaut 2) mais si le
champs B a 6 bit ca marche pas
( sizeof (tS) vaut alors 3)
comment faire pour forcer le compilateur a mettre les champs a la suite ?


Le langage C ne prévoit aucun mecanisme de la sorte. Ca peut être une
caractéristique de ton compilateur. A voir sur le forum concerné.

Sinon, si on veut définir un bit précisément par rapport à sa position, il
faut utiliser les opérateurs logiques (bitwise operators) tels que

& | ~ ^ << >>

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Richard Delorme wrote:

- soit en changeant l'ordre des champs :
typedef struct {
unsigned char A:3;
unsigned char C:3;
unsigned char B:6;
unsigned char D:1;
unsigned char E:1;
} tS;
- soit en utiliseant unsigned short :
typedef struct {
unsigned short A:3;
unsigned short B:6;
unsigned short C:3;
unsigned short D:1;
unsigned short E:1;
} tS;



Ni l'un ni l'autre. Il faut utiliser int ou unsigned int. Le reste dépend de
l'implémentation. La taille minimale d'un champ de bits est donc de 16.
L'ordre des bits n'est pas spécifié.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "fredPPP" wrote:

Le changement d'ordre des champs marchent ,malheureusement ,comme je
traitre des données venant d'un microcontroleur, je ne suis pas maitre
de celles ci, Le unsigned short donne le même résultat que le unsigned
char


Alors utilise les opérateurs logiques. C'est fait pour ça, et c'est
portable (sur des non signés)

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Richard Delorme
Emmanuel Delahaye a écrit:

In 'fr.comp.lang.c', Richard Delorme wrote:

- soit en changeant l'ordre des champs :
typedef struct {
unsigned char A:3;
unsigned char C:3;
unsigned char B:6;
unsigned char D:1;
unsigned char E:1;
} tS;
- soit en utiliseant unsigned short :
typedef struct {
unsigned short A:3;
unsigned short B:6;
unsigned short C:3;
unsigned short D:1;
unsigned short E:1;
} tS;



Ni l'un ni l'autre. Il faut utiliser int ou unsigned int.


ou _Bool.
Mais utiliser autre chose est une extension courante tolérée par la norme
(Cf annexe K), et qui, a priori, marchait sur l'implémentation de l'OP.


--
Richard