Forum: Compiler & IDEs *(uint16_t *)&test[0] = ady; ???


von Schnarcher (Gast)


Lesenswert?

Hallo,
es ist schon spät, aber vileicht kann mir ja jedand den Ausdruck im
Betreff erklären!
Weiter unten steht der Kontext!
Währe ect super, Danke schon mal.


Code:

uint8_t test[10];
foo0()
{
  ...
  para[0] = 0x80;
  ...
}

foo1()
{
   ...
   *(uint16_t *)&test[0] = ady;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

&test[0] ist identisch zu test selbst: es ergibt die (Anfangs-)
Adresse des Arrays test.

Diese wird als Zeiger auf einen vorzeichenlosen 16-bit-Integer
interpretiert, und auf die Adresse, auf die er zeigt, wird der
Wert ady geschrieben.

Warum jemand ein Array namens test aus vorzeichenlosen 8-bit-
Integers (uint8_t) zusammensetzt, um es dann aber mit 16-bit-
Integerwerten zu füllen, musst du den werten Autor fragen.

von Der Albi (Gast)


Lesenswert?

Naja. Man kann so z.B bequem auf die Bytes der Zahl zugreifen.
Also falls das obere UND das untere Byte für
Weiterverarbeitungsschritte benötigt wird ist die Methode
wahrscheinlich schneller als

char low = (char)INT16;
char hi  = (char)(INT16>>8);

Wobei: wenn INT16 bei mir eine Registervariable wäre (low und hi auch)
und der Compiler geschickt optimieren würde, dann wären das nur 2
mov's.
Also ist das bei kleinen Datenmengen relativ sinnlos.
Ich habe diese "Tricks" mal verwendet, als es draum ging aus einem
Speicherblock eine Struktur zu kopierten, die an beliebiger Stelle im
Block stehen konnte.. erleichtert ne Menge Schreibarbeit.


MFG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.