Forum: PC-Programmierung Structinhalt als boolvariable printen


von Marko (Gast)


Lesenswert?

ich habe structs, welche ich mir gerne mittels einer variablen 
ausprinten möchte (in c). Der struct hat drei elemente, 
enabled/disabled, on/off und der wert
1
typedef struct  __attribute__ ((packed)){
2
  unit8_t enabled :1;
3
  uint8_t on    :1;
4
  uint8_t value  :255;
5
}sensor

wie kann ich das ganze denn jetzt in eine uint16_t variable packen um es 
mir auszugeben?
1100000111000000

erste 1: enabled
zweite 1: on
3-10 0 oder 1: value vom Sensor
11 -16 :alles 0

hier könnte ich auch alle drei elemente einzeln ausgeben.
Später kommt aber noch ein großer struct dazu (um die 50 Elemente). Da 
würde ich dann ungern alles einzeln abtippen, sondern quasi nur eine 
Variable ausgeben, aus der man dann alles ablesen kann

von heini (Gast)


Lesenswert?

Marko schrieb:
> ich habe structs, welche ich mir gerne mittels einer variablen
> ausprinten möchte (in c). Der struct hat drei elemente,
> enabled/disabled, on/off und der wert
> typedef struct  _attribute_ ((packed)){
>   unit8_t enabled :1;
>   uint8_t on    :1;
>   uint8_t value  :255;
> }sensor
>

der member value soll 255 bit breit sein?

von Marko (Gast)


Lesenswert?

heini schrieb:
> der member value soll 255 bit breit sein?

nein. denkfehler. Aber danke für den Hinweis :)

> typedef struct  attribute ((packed)){
>   unit8_t enabled :1;
>   uint8_t on    :1;
>   uint8_t value  :8;
> }sensor

von Philipp Klaus K. (pkk)


Lesenswert?

Marko schrieb:
> ich habe structs, welche ich mir gerne mittels einer variablen
> ausprinten möchte (in c). Der struct hat drei elemente,
> enabled/disabled, on/off und der wert
> typedef struct  _attribute_ ((packed)){
>   unit8_t enabled :1;
>   uint8_t on    :1;
>   uint8_t value  :8;
> }sensor


Hat zwar nichts mit deiner Frage zu tun, aber: Warum verwendest du hier 
uint8_t? Ich hätte bool für enabled und on verwendet, unsigned int für 
value.

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

Philipp Klaus K. schrieb:
> Hat zwar nichts mit deiner Frage zu tun, aber: Warum verwendest du hier
> uint8_t? Ich hätte bool für enabled und on verwendet, unsigned int für
> value.

Bei den meisten Architekturen sind bool nichts anderes als int. Somit 
wäre die struct wesentlich größer.

Marko schrieb:
1
typedef struct  attribute ((packed)){
2
   unit8_t enabled :1;
3
   uint8_t on    :1;
4
   uint8_t value  :8;
5
}sensor

Du willst am Ende eine 16-Bit-breite struct haben?
Dann solltest du als "Grundtyp" schon mal (u)int16_t verwendent.
1
typedef struct  attribute ((packed)){
2
   unit16_t enabled :1;
3
   uint16_t on      :1;
4
   uint_t value     :8;
5
}sensor

Umd daraus dann noch eine uint16_t-Variable zu machen, verwendet man 
gerne "union".

von Philipp Klaus K. (pkk)


Lesenswert?

STK500-Besitzer schrieb:
> Philipp Klaus K. schrieb:
>> Hat zwar nichts mit deiner Frage zu tun, aber: Warum verwendest du hier
>> uint8_t? Ich hätte bool für enabled und on verwendet, unsigned int für
>> value.
>
> Bei den meisten Architekturen sind bool nichts anderes als int. Somit
> wäre die struct wesentlich größer.
>

Ein 1-bit Bitfeld vom Typ bool belegt 1 Bit, genau wie ein 1-Bit-Bitfeld 
jedes anderen Typs.

> Marko schrieb:
>
1
> typedef struct  attribute ((packed)){
2
>    unit8_t enabled :1;
3
>    uint8_t on    :1;
4
>    uint8_t value  :8;
5
> }sensor
6
>
>
> Du willst am Ende eine 16-Bit-breite struct haben?
> Dann solltest du als "Grundtyp" schon mal (u)int16_t verwendent.
>
1
> typedef struct  attribute ((packed)){
2
>    unit16_t enabled :1;
3
>    uint16_t on      :1;
4
>    uint_t value     :8;
5
> }sensor
6
>
>
> Umd daraus dann noch eine uint16_t-Variable zu machen, verwendet man
> gerne "union".

Der aktuelle C-Standand erlaubt Implementierungen zwar, weitere 
Datentypen in Bitfeldern zu unterstützen, aber er verlangt ist nur 
Unterstützung für: bool, int, signed int, unsigned int. Bei portablem 
Code sollte man sich also auf diese Typen beschränken.

von Rolf M. (rmagnus)


Lesenswert?

Philipp Klaus K. schrieb:
> bool, int, signed int, unsigned int. Bei portablem
> Code sollte man sich also auf diese Typen beschränken.

Wobei man auf int auch verzichten sollte, da in Bitfeldern (und nur 
dort) implementationsspezifisch ist, ob der dann vorzeichenbehaftet ist 
oder nicht.

von Philipp Klaus K. (pkk)


Lesenswert?

Rolf M. schrieb:
> Philipp Klaus K. schrieb:
>> bool, int, signed int, unsigned int. Bei portablem
>> Code sollte man sich also auf diese Typen beschränken.
>
> Wobei man auf int auch verzichten sollte, da in Bitfeldern (und nur
> dort) implementationsspezifisch ist, ob der dann vorzeichenbehaftet ist
> oder nicht.

Was überraschend ist, wenn man den int nicht direkt sieht, man z.B. ein 
Bitfeld vom Typ int_least16_t anlegt, der int_least16_t dann per typedef 
in stdint.h ein int ist, und man dann im Bitfeld einen unsigned int 
bekommt.

von zitter_ned_aso (Gast)


Lesenswert?

Be "signed/unsigned int" wäre ja sein Bietfeld sogar größer als eine 
normale Struktur wie:
1
      struct sensor {                                                   
2
          bool some_settings_1;                                         
3
          bool some_settings_2;                                         
4
          uint8_t some_values;                                          
5
      };

von zitter_ned_aso (Gast)


Lesenswert?

zitter_ned_aso schrieb:
> Bietfeld

bit

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.