Y a-t-il un moyen d'accéder à des bits individuels avec une union?
Je suis en train d'écrire un programme C. Je veux une variable que je peux accéder à un char, mais je peux aussi accès aux bits de. Je pensais que je pouvais utiliser une union comme ça...
typedef union
{
unsigned char status;
bit bits[8];
}DeviceStatus;
mais le compilateur n'aime pas cela. Apparemment, vous ne pouvez pas utiliser les bits dans une structure.
Que puis-je faire à la place?
source d'informationauteur PICyourBrain
Vous devez vous connecter pour publier un commentaire.
Sûr, mais vous voulez vraiment utiliser une structure pour définir les bits comme ce
Puis vous pouvez y accéder pour
DeviceStatus ds;
vous pouvez accéder àds.u.bit1
. Aussi, certains compilateurs va effectivement vous permettre de disposer de anonyme les structures à l'intérieur de l'union, de sorte que vous pouvez accéder àds.bit1
si vous omettre l'u à partir de la définition de type.Vous avez un couple de possibilités. On serait d'utiliser Boolean mathématiques pour obtenir les bits:
Une autre est d'utiliser bitfields:
La première est (au moins sans doute) plus portable, mais quand vous avez affaire avec les bits d'état, les chances sont que le code n'est pas même légèrement portable de toute façon, de sorte que vous ne se soucient pas beaucoup parler...
Comme cela a déjà été dit, vous ne pouvez pas l'adresse de la mémoire plus petit qu'un octet en C. je voudrais écrire une macro:
et l'utiliser pour accéder à l'bits. De cette façon, votre accès est le même, quelle que soit la taille de la structure, vous accédez. Vous pouvez écrire votre code comme:
Cela vous donne l'accès à proximité de votre système, utilisez [] au lieu de ().
La plus petite unité adressable en C est toujours un octet (appelé
char
en C). Vous ne pouvez pas accéder à un bit directement. Le plus proche de façon à obtenir à l'accès aux bits serait de définir un type de données appelébitpointer
et de définir certaines fonctions ou macros:Je recommande contre les syndicats, car il est de mise en œuvre définies par si ils sont remplis msb-lsb ou lsb-msb (voir la norme ISO C99, 6.7.2.1p10).
Vous pouvez le faire en mettant les bits dans une structure à l'intérieur de l'union, mais il peut ou peut ne pas fonctionner, en fonction de votre mise en œuvre. Le langage de définition ne précise pas dans quel ordre les bits séparés seront en adéquation avec les bits de la
unsigned char
; pire, il n'a pas la même garantie que les pièces se chevauchent avec leunsigned char
(le compilateur peut décider de placer les bits séparés en direction de la plus importante côté d'un mot et launsigned char
vers le moins significatif de côté ou vice versa).La technique habituelle dans votre situation est l'utilisation des opérations bit à bit. Définir des constantes nommées d'après la signification des bits, par exemple,
Puis à lire et à écrire des bits individuels: