Pointer bitwise operator

Gast #3291789
Lesenswert?

Ich versuche mit einem Pointer die Struktur eines Structs zu umgehen.
Leider bekomme ich immer die Fehlermeldung
"expression must have integral type".
Kann mir jemand weiterhelfen?
1
struct fnc_lat
2
{
3
  unsigned int pv      :2;    // Prescaler Value
4
  unsigned int pd2    :1;    // Power Down 2
5
  unsigned int cs2    :3;    // Current Setting 2
6
  unsigned int cs1    :3;   // Current Setting 1
7
  unsigned int tcc    :4;    // Timer Counter Control
8
  unsigned int fm      :1;   // Fastlock Mode
9
  unsigned int fe      :1;    // Fastlock Enable
10
  unsigned int cdt    :1;    // CP Threestate
11
  unsigned int pcp    :1;    // PD Polarity
12
  unsigned int mux    :3;    // MUX Control
13
  unsigned int pd1    :1;    // Power Down 1
14
  unsigned int cr      :1;    // Counter Reset
15
  unsigned int cb      :2;    // Control Bit
16
} f_lat_data, i_lat_data;
17
  
18
struct fnc_lat *pointer_f_lat_data = &f_lat_data;
19

20
//...
21

22
*pointer_f_lat_data &= 0x1FF803;
23
*pointer_f_lat_data |= (p.data & 0x1FF) << 2;
24
*pointer_f_lat_data |= (p.data & 0xE00) << 21;

DANKE

Gerhard
Gast #3291794
Lesenswert?

Verwende eine union:
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int pv      :2;    // Prescaler Value
5
  unsigned int pd2    :1;    // Power Down 2
6
  unsigned int cs2    :3;    // Current Setting 2
7
  unsigned int cs1    :3;   // Current Setting 1
8
  unsigned int tcc    :4;    // Timer Counter Control
9
  unsigned int fm      :1;   // Fastlock Mode
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int cdt    :1;    // CP Threestate
12
  unsigned int pcp    :1;    // PD Polarity
13
  unsigned int mux    :3;    // MUX Control
14
  unsigned int pd1    :1;    // Power Down 1
15
  unsigned int cr      :1;    // Counter Reset
16
  unsigned int cb      :2;    // Control Bit
17
  } BITS;
18
  uint32_t RAW;
19
} f_lat_data, i_lat_data;
20

21
f_lat_data.BITS.pv = 3;
22
f_lat_data.RAW &= 0x1FF803;
23
f_lat_data.RAW |= (p.data & 0x1FF) << 2;
24
f_lat_data.RAW |= (p.data & 0xE00) << 21;
Moderator #3291862
Lesenswert?

Gerhard schrieb:
> *pointer_f_lat_data |= (p.data & 0xE00) << 21;

Da sollte wohl "<< 12 stehen.

Den Vorschlag vom Kindergärtner solltest du gut testen, da nicht 
garantiert ist, dass er funktioniert. Ob er funktioniert hängt von der 
internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.

Aber warum willst du überhaupt den Zugriff über die Bitfelder umgehen? 
Die hast du (oder jemand anderer) doch gerade deswegen angelegt, um den 
Zugriff auf die einzelnen Elemente komfortabler und durchsichtiger zu 
machen.
Gast #3291885
Lesenswert?

Yalu X. schrieb:
> Ob er funktioniert hängt von der
> internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.
Das würde aber auch für jegliche andere Form von Direkt-Zugriff (ohne 
Bitfield) gelten (wie zB wildes casten). Wobei ich auch da lieber 
nochmal den Standard konsultieren würde, ob das für Bitfelder nicht 
vielleicht doch garantiert ist...!
Moderator #3291933
Lesenswert?

Kindergärtner schrieb:
> Yalu X. schrieb:
>> Ob er funktioniert hängt von der
>> internen Darstellung der Bitfelder und dem überlagerten uint32_t ab.
> Das würde aber auch für jegliche andere Form von Direkt-Zugriff (ohne
> Bitfield) gelten (wie zB wildes casten).

Klar, das macht keinen großen Unterschied. Deswegen habe ich ihn ja 
gefragt, warum er überhaupt mit solchen Tricks arbeiten will. Er kann 
die Zuweisung der einzelnen Elemente ja auch über die Bitfelder machen. 
Er könnte auch auf die Bitfelder (und die Struktur) komplett verzichten 
und alle Operationen mit Bit-Arithmetik auf einem 32-Bit-Int machen. Nur 
beide Methoden zu mischen ist weniger ratsam. Aber selbst das ist 
möglich (Portabilität steht auf diesem hardwarenahen Level wohl kaum im 
Vordergund), man muss es eben ausgiebig testen.

Ich habe das Beispiel auf dem PC getestet, da hat es schon einmal nicht 
funktioniert, wenn man davon ausgeht, dass durch die beiden letzten 
Anweisungen die Bit-Felder fm, fe, cdt, pcp, mux, pd1 und cr sowie pv 
und pd2 beschrieben werden sollen.

> Wobei ich auch da lieber
> nochmal den Standard konsultieren würde, ob das für Bitfelder nicht
> vielleicht doch garantiert ist...!

Für Bitfelder ist im Standard fast nichts garantiert ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren