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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
"Richard Delorme" <abulmo@nospam.fr> a écrit dans le message de news:
3f0ad688$0$9624$7a628cd7@news.club-internet.fr...
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.
"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.
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
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" <abulmo@nospam.fr> a écrit dans le message de news:
3f0ad688$0$9624$7a628cd7@news.club-internet.fr...
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;
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
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.
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.
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.
Emmanuel Delahaye
In 'fr.comp.lang.c', "fredPPP" wrote:
j'ai un problème de longueur de structure en visual C++
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/
In 'fr.comp.lang.c', "fredPPP" <fredPPP@hotmail.com> wrote:
j'ai un problème de longueur de structure en visual C++
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- emdelYOURBRA@noos.fr [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/
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/
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/
In 'fr.comp.lang.c', Richard Delorme <abulmo@nospam.fr> 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- emdelYOURBRA@noos.fr [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/
- 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/
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/
In 'fr.comp.lang.c', "fredPPP" <fredPPP@hotmail.com> 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- emdelYOURBRA@noos.fr [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/
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/
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
Emmanuel Delahaye a écrit:
In 'fr.comp.lang.c', Richard Delorme <abulmo@nospam.fr> 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.
- 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.