Frage: da ja ein Feld in einem Array bloß auf eine Speicheradresse zeigt. Kann man den beim Auslesen mit einem 2 Byte großen Wert "weiterlesen"? Also wie folgt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Was passiert in diesem Fall bei einer Zuweisung?
1 | |
2 | |
3 | |
4 | |
|
Anzeige
|
16Bit Wert aus 8Bit ArrayFrage: da ja ein Feld in einem Array bloß auf eine Speicheradresse zeigt. Kann man den beim Auslesen mit einem 2 Byte großen Wert "weiterlesen"? Also wie folgt:
Was passiert in diesem Fall bei einer Zuweisung?
Gast
#4761642
Rene K. schrieb: > Frage: da ja ein Feld in einem Array bloß auf eine Speicheradresse > zeigt. Kann man den beim Auslesen mit einem 2 Byte großen Wert > "weiterlesen"? Nein, nicht ohne Weiteres. > if(c_array[0] == u_value) Wird immer "false" sein. > Was passiert in diesem Fall bei einer Zuweisung? u_value wird nach uint8_t gecastet, unter Bitverlust, und dann zugewiesen. Also die untersten 8 Bits, wenn ich das richtig sehe. Man kann da auch nichts mit Pointercasting reißen, weil das Aliasing wäre und nach C-Standard nicht definiert. Allenfalls mit ner Union wäre da was zu machen. if((uint16_t)(c_array[0] | c_array[0+1]<<8 ) == u_value) {
....
Alles klar, danke :-D Naja, bevor da ich da mit Unions "rumspiele" (Wobei da auch das Problem der Zuweisung ja weiterhin besteht) - Bitschubse (TM) ich mir dann halt einfach [0]..[1] in eine uint16 zusammen und vergleiche das so oder Bitreiße (TM) es dann wieder zu einzelnen Bytes auseinander. :-) Danke für deine Aufklärung. EDIT: Dennis H. schrieb: > if((uint16_t)(c_array[0] | c_array[0+1]<<8 ) == u_value) { > > .... Ja genau so :-D
Gast
#4761648
Das geht auch, allerdings solltest Du Dir dann Gedanken über korrekte Endianess machen.
Gast
#4761649
Nop schrieb: > korrekte Endianess Wobei das bei der Union natürlich auch nicht anders wäre. Nop schrieb: > Das geht auch, allerdings solltest Du Dir dann Gedanken über korrekte > Endianess machen. Das Projekt ist nur für eine Architektur gedacht. Kann ich vernachlässigen. Aber danke für den Hinweis. EDIT: Nen Union (wo das ich eigentlich nicht nutzen will) dafür sähe dann so aus oder:
Gast
#4761663
ich würd die zweite Komponente der Union mit nem struct aus zwei uint16 und einem uint8 machen.
Gast
#4761666
Etwa so:
Es gibt immer noch memcpy aus der Standard Library.
Gast
#4761991
im Embedded-Bereich sollte man sich für den direktn Zugriff mit anderer Bitbreite entsprechende Routinen bereithalten. Verschiedene Arten sind möglich, ich gebe mal Beispiele für den 16-Bit-Zugriff (Word). Entscheide Dich für eine Art, die in Deinem Projekt am sinnvollsten ist und implementiere sie dann für alle benötigten Breiten als Inline oder als #define
Mit dem Makro kannst Du an der Adresse mit 16 Bit lesen und schreiben!
Wenn Du es nicht willst, caste auf (const uint16 *).
Gast
#4762008
Rene K. schrieb: > Dennis H. schrieb: >> if((uint16_t)(c_array[0] | c_array[0+1]<<8 ) == u_value) { >> >> .... > > Ja genau so :-D wobei der cast nicht notwenig ist. es wird immer mit 16bit gerechnet.
Gast
#4762022
union {
uint_8 i8[2];
uint_16 i16;
} buffer;
buffer.i8[0] = c_array[0];
buffer.i8[1] = c_array[1];
if(buffer.i16 == u_value)
{
//true
}
else
{
//false
}
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|