Hi Leute!
jedes mal, wenn ich nicht mehr weiter gewusst habe, habt ihr mit
geholfen!
Hoffentlich könnt ihr mir auch jetzt weiterhelfen!
ich habe folgendes struct
1
struct
2
{
3
unsignedchare1:1;
4
unsignedchare2:1;
5
unsignedchard7:1;
6
unsignedchard6:1;
7
unsignedchard5:1;
8
unsignedchard4:1;
9
unsignedcharrs:1;
10
unsignedcharrw:1;
11
}data;
die einzelnen bits werden im code gesetzt.
Nun will ich aber data auslesen in ein anderes char schreiben!
wie kann ich das machen?
Im Watch-Fenster von Microchips MPLAB wird die der hex-code des struct
angezeigt, jedoch beim versuch , das struct auszulesen, bricht der
compiler mit einem error ab.
1
chartext;
2
text=data;
hier kommt dann die errormeldung:
error: incompatible types in assignment
K.A. was der von mir will!
wie muss ich den code schreiben, damit ich das komplette struct auslesen
kann?
lg jibbel
Klaus Wachtler schrieb:
> oder die schmutzige und schnelle Variante:>
1
>dataa;
2
>unsignedchartext;
3
>...
4
>text=*(unsignedchar*)&a;
5
>
text = 0x69
text2 = 0x96
Tja, da hab ich wohl die Reihenfolge vertauscht... hätte jetzt gedacht,
dass ein Bitfield vom höchsten Bit an losgeht anstatt vom niedrigsten.
Mark Brandis schrieb:
> Tja, da hab ich wohl die Reihenfolge vertauscht...
Ja das hängt allgemein davon ab, ob du eine Little Endian oder Big
Endian Maschine hast. Bei Little Endian steht Bit0 an oberster Stelle
bei solch einem struct. Sonst genau anders herum.
nein, das hat damit nicht direkt zu tun.
Bei little- und big endian unterscheiden sich dann die Reihenfolge,
in der die Bytes der int im Speicher liegen, was nun bei 8 Bit
bzw. 1 Byte so viel wie wenig ausmacht.
Bitfelder werden (auch falls es um mehr als 1 Byte geht) bei
allen mir bekannten Compilern ab Bit 0 gefüllt, egal wie
die Endianness aussieht.
Ob das jetzt irgendein C-Standard so vorschreibt oder
eine freiwillige Übereinkunft ist, weiß ich nicht.
Hauptsache, es ist so.
Nichts. Erstens finde ich es umständlich, überall, wo die Struktur
verwendet wird, ein '.data' anhängen zu müssen, nur weil an einer
einzigen Stelle das Byte gebraucht wird, zweitens sind unions gar nicht
dafür gedacht. Das Verhalten ist laut ISO-C undefiniert.
Klaus Wachtler schrieb:
> Bitfelder werden (auch falls es um mehr als 1 Byte geht) bei> allen mir bekannten Compilern ab Bit 0 gefüllt, egal wie> die Endianness aussieht.
Zumindest im ARM ABI wird die Reihenfolge aber geändert. Entsprechende
Compiler müssen sich daran halten.
Gruß
Marcus
Rolf Magnus schrieb:
> Nichts. Erstens finde ich es umständlich, überall, wo die Struktur> verwendet wird, ein '.data' anhängen zu müssen, nur weil an einer> einzigen Stelle das Byte gebraucht wird, zweitens sind unions gar nicht> dafür gedacht.
Zumindest sind sie dafür unglaublich praktisch :-) Wenn man dann noch
einen Compiler hat, der per Erweiterung anonymous structs beherrscht
(z.B. GCC, RVCT), dann kann man sich das '.data' sparen.
Gruß
Marcus
Ich kann da nichts praktisches dran finden. Außerdem ist es mit Casts
besser lesbar, weil man da gleich sieht, was passiert, statt daß
irgendwo "hintenrum" Typen uminterpretiert werden. Sowas will ich doch
lieber explizit im Code stehen haben. Dazu kommt dann noch das Problem
mit der ISO-Konformität und Portabilität. Deshalb verstehe ich nicht,
wieso die union-Methode so weit verbreitet und so populär ist.
Klaus Wachtler schrieb:
> nein, das hat damit nicht direkt zu tun.>> Bei little- und big endian unterscheiden sich dann die Reihenfolge,> in der die Bytes der int im Speicher liegen, was nun bei 8 Bit> bzw. 1 Byte so viel wie wenig ausmacht.>> Bitfelder werden (auch falls es um mehr als 1 Byte geht) bei> allen mir bekannten Compilern ab Bit 0 gefüllt, egal wie> die Endianness aussieht.
Ich weiß wenigstens 2 Compiler (für big endian CPUs) bei denen die
Bitfelder genau anders herum angelegt werden (innerhalb eines Bytes) als
z.B. bei MS C-Compiler (VS6). Ob das allerdings den Compilerherstellern
überlassen wird, das weiß ich nicht.
1
struct bert
2
{
3
int bit_a : 1;
4
int bit_b : 1;
5
int bits : 30;
6
}
bei MS-C kommt beim setzen von bit_a ein 0x00000001 heraus. Bei den
Compilern der Big Endian CPUs (die ich kenne) kommt 0x80000000 heraus.
Klaus Wachtler schrieb:
> BTW: hat 900ss was mit Ducati zu tun?
Ja, aber Bj. 81. Die haben noch einen schönen Sound. Da fallen die
morschen Äste aus den Bäumen, wenn du durch einen Wald fährst ;-)
> Portabler oder ISO-konformer ist meine Zeigervariante> auch nicht.
Doch. Naja, portabel ist es ja sowieso nicht, aber unions sind da nur
noch ein weiterer Faktor, den man beachten muß.
ISO-konform ist es aber im Gegensatz zu den unions.