uint16_t auf uint8_t

Gast #868994
Lesenswert?

Hi,
ich habe eine Variable: uint16_t id
und ein Array: uint8_t array[10]

Nun habe ich dass hier geschrieben:
1
*(uint16_t*)&array[1]= id;

damit weiße ich array[1] das lowbyte und array[2] das highbyte zu. Laut 
*.lss wird dass ohne irgendeinen Overhead wie gewünscht richtig 
umgesetzt.


Die Frage ist jetzt nur kann man das auch lesbarer schreiben?
#869002
Lesenswert?

Ulrich wrote:

> Nun habe ich dass hier geschrieben:
>
1
*(uint16_t*)&array[1]= id;

> Die Frage ist jetzt nur kann man das auch lesbarer schreiben?

Statt einem Array eine Struct verwenden, in der die einzelnen 
Speicherstellen aussagekräftige Namen haben. Evtl mit anonymen Unions 
drinnen, wenn sowohl 16- als auch 8-Bit Zugriffe nötig sind.

z.B.
1
struct wasweisich {
2
  uint8_t befehl;
3
  union {
4
    uint16_t argument;
5
    uint8_t argument_byte[2];
6
  }
7
}
8

9
...
10

11

12
struct wasweisich a;
13
a.befehl=42;
14
a.argument=5678;
15
if (a.argument_byte[0]==23) {

Wenn das Speicherlayout wichtig ist, noch ein __attribute(packed) an die 
struct-definition anhängen.
Gast #869019
Lesenswert?

aso ich habe noch was vergessen:

An vielen verschiedenen stellen im code habe ich solche zuweisungen in 
vorhandenen arrays mit unterschiedlichem aufbau. Deswegen kann ich das 
nur so wie oben schreiben. Die frage ist nur kann man den cast 
verkürzen? Kann man da irgendwie den referenzierungs und 
dereferenzierungsoperator weglassen?
Gast #869044
Lesenswert?

Entweder du hast deinen Post noch editiert oder ich habs überlesen.

Ich mache es jetzt mit #define:
1
#define cast16 *(uint16_t*)&
2

3
cast16 array[1]= id;

funktioniert perfekt und vermeidet sicherlich den einen oder anderen 
bösen castfehler.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren