Thomas P. schrieb:
> Ich verstehe jetzt nicht, warum das in
> undefiniertem Verhalten enden soll.
Weil das so im Standard steht. Mit vielen Compilern funktioniert das
wahrscheinlich wie gewünscht, ab einer neuen Compilerversion treten
vielleicht plötzlich Fehler auf, die dich verzweifeln lassen...
Thomas P. schrieb:
> Details zur Definition der Bitfelder
> muss ich mir noch mal anlesen, da bin ich wohl einem falschen Beispiel
> aufgesessen.
Wenn du den Code nur mit einem Compiler verwendest, der diese Definition
akzeptiert, ist alles in Ordnung. Du musst dir einfach bewusst sein,
dass dein Code dann nicht portabel ist. Auch bei kleinen
Mikrocontrollern ist der erhöhte Speicherverbrauch (z.B. 2 statt 1 Byte)
meist kein Problem. Wenn doch, kann man immer noch die nicht portable
Version verwenden.
Thomas P. schrieb:
> Sollte man diese Bitzugriffe besser auf Bitmanipulation mit
> and und or umstellen?
Ja. Ist in deinem Fall auch nicht sehr aufwändig. Ich würde bei deinem
Beispiel Funktionen zur Konvertierung von uint8_t zu gzi_dat_t und
umgekehrt schreiben.
P.S: Wenn wir schon beim Thema Portabilität sind: Die (u)intXX_t-Typen
sind nicht portabel, da die vom Standard nicht zwingend verlangt werden
(es existieren Plattformen, auf denen uint8_t nicht vorhanden ist).
Stattdessen besser (u)int_leastXX_t zum Speichern von Werten und
(u)int_fastXX_t für Berechnungen verwenden.