Hallo Leute, ich habe folgendes Code geschrieben, um 4 Bytes zu uint32 zu convertieren: int main(void) { typedef union typ { uint32_t b_32; uint8_t b_8[4]; }typ_array; typ_array x; while (1) { x.b_8[0] = 1; x.b_8[1] = 2; x.b_8[2] = 3; x.b_8[3] = 4; } } Wenn ich x.b_32 ausgabe, bekomme ich 0x0201 (Es sollte aber 0x04030201 sein) weiss jemand, warum dies nicht funktioniert, wie ich es möchte? Vielen Dank
:
Gesperrt durch User
Alternativ könntest du die vier Bytes natürlich auch mit Hilfe eines Pointers an die vier Adressen im RAM schreiben an welcher die 32Bit Variable liegt. Das wäre der Weg den ich eher gehen würde als über eine Union und ein Array. Problem dabei wäre natürlich, daß du dafür natürlich die Reihenfolge beachten müsstest, in welcher der Compiler die Variable im Speicher ablegt (little endian oder big endian). Diese Lösung "kann" also auf unterschiedlichen Compilern zu fehlerhaftem Verhalten führen. Dann könntest du ebenfalls noch folgende Möglichkeit verwenden: b_32 = 4 * 0x1000000 b_32 += 3 * 0x10000 b_32 += 2 * 0x100 b_32 += 1 Ein guter Compiler würde natürlich keine Multiplikation ausführen, da die Faktoren die Zahlen eben immer nur um jeweils ein Byte weiter nach oben in die 32Bit Zahl schreiben würde. Um sicherzugehen würde ich mir natürlich den generierten Assemblercode zu diesen Zeilen anschauen um sicherzugehen. ;) Bei dieser Version bist du zumindest schon mal Compiler unabhängig. Ebenso könntest du auch mit Schiebeoperationen arbeiten und was es nicht noch alles für Möglichkeiten gibt. Also es führen wirklich viele Wege nach Rom, man muß sich nur für einen entscheiden. :) Ciao, Rainer
> uint32_t b_32; > uint8_t b_8[4]; Grüß Dich, vorsicht mit dieser deklaration. es sind gewisse Variablennamen nicht erlaubt (weis ich vom letzten Freitag^^), z.b. wenn du test_integer_32bit benutzt, müsste er es bei dir unterringeln. Ich arbeite mit den neuesten Atmelstudio und einen ATmega8 und ATmega32. Vielleicht sind es bei dir andere Variablennamen. Probier einfach namen aus wie pizza_schnitte oder sowas, und versuche es dann nochmals. Gehört eigentlich die Zuweisung
1 | x.b_8[0] = 1; |
2 | x.b_8[1] = 2; |
3 | x.b_8[2] = 3; |
4 | x.b_8[3] = 4; |
nicht einmal ausgeführt, und somit nicht in die while-schleife? mfg, tommyProg
Tho Wes schrieb: >> uint32_t b_32; >> uint8_t b_8[4]; > > Grüß Dich, > > vorsicht mit dieser deklaration. es sind gewisse Variablennamen nicht > erlaubt (weis ich vom letzten Freitag^^), z.b. wenn du > test_integer_32bit benutzt, müsste er es bei dir unterringeln. > Ich arbeite mit den neuesten Atmelstudio und einen ATmega8 und ATmega32. > > Vielleicht sind es bei dir andere Variablennamen. Probier einfach namen > aus wie pizza_schnitte oder sowas, und versuche es dann nochmals. Sorry. Aber das ist (fast) alles kompletter Blödsinn. Ja, es gibt reservierte Schemata für Variablennamen. Nein, seine gehören nicht dazu. > Gehört eigentlich die Zuweisung > >
1 | > x.b_8[0] = 1; |
2 | > x.b_8[1] = 2; |
3 | > x.b_8[2] = 3; |
4 | > x.b_8[3] = 4; |
5 | >
|
> nicht einmal ausgeführt, und somit nicht in die while-schleife?
Auch das ist Blödsinn. Darum gehts überhaupt nicht.
:
Bearbeitet durch User
Jetzt seh ichs erst. Das Posting ist von 2008 und sein Problem ist ganz einfach, dass er wahrscheinlich die falsche Ausgabefunktion benutzt hat. Eine für uint16_t und nicht eine für uint32_t.
:
Bearbeitet durch User