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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.