Bonjour,
Je programme sur un microcontrolleur 8 bit (PIC18 de chez microchip) et j'utilise le compilateur MCC18 (microchip).
J'ai défini des unions et des structures :
et voici mon programme (myVar2 et myVar3 sont des variables globales) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 typedef struct _Struct1 { unsigned int a; unsigned char b; } Struct1; typedef union _Union2 { unsigned int Val; struct { unsigned char ValL; unsigned char ValH; }; struct { unsigned int a:8; // bit0-7 unsigned int b:8; // bit8-15 }; } Union2; Union2 myVar2; typedef union _Union3 { unsigned int Val; struct { unsigned char ValL; unsigned char ValH; }; struct { unsigned int a:1; // bit0 unsigned int b:1; // bit1 unsigned int c:1; // bit2 unsigned int d:1; // bit3 unsigned int e:1; // bit4 unsigned int f:1; // bit5 unsigned int g:1; // bit6 unsigned int h:1; // bit7 unsigned int i:2; // bit8-9 unsigned int j:4; // bit10-13 unsigned int k:1; // bit14 unsigned int l:1; // bit15 }; } Union3; Union3 myVar3;
=> ça ne fonctionne pas correctement, la valeur de myVar1.a n'est pas correcte : j'ai l'impression que j'ai des problème sur les opérations de décalage (ça décale sur toute la variable au lieu du champs. Est-ce que je peux avoir le même problème sur des opérations logique tel que OU, ET, NON ... ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Struct1 myVar1; myVar1.a = (myVar2.a << 4); myVar1.a |= myVar3.j;
par contre ce code "à l'air de fonctionner" correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Struct1 myVar1; myVar1.a = ((unsigned int)myVar2.a << 4); myVar1.a |= myVar3.j;
=> pouvez-vous me dire de quoi ça vient ? ... a priori l'utilisation de champs de bits pose des problèmes si on fait des opérations tel que des décalages.
Quels sont les méthodes à utiliser pour faire des décalages et des opération logique sur des champs de bits sans avoir de mauvaises surprises ?
Partager