Code lese problem

#3883307
Lesenswert?

Servus,

im ZUsammenhang einer SPI und der Zusammensetzung von 4 Bytes zu einem 
uint32_t frage ich mich, was genau  der code von Karl Heinz macht:
1
  uint32_t speicherzusammensetzung;
2
  
3
  *( (uint8_t*)&speicherzusammensetzung + 0 ) =speicherzusammensetzung_array[0];
4
  *( (uint8_t*)&speicherzusammensetzung + 1 ) =speicherzusammensetzung_array[1];
5
  *( (uint8_t*)&speicherzusammensetzung + 2 ) =speicherzusammensetzung_array[2];
6
    *( (uint8_t*)&speicherzusammensetzung + 3 ) =speicherzusammensetzung_array[3];
7
  return speicherzusammensetzung;
insbesondere das **( (uint8_t*)* sowie das **( 
(uint8_t*)&speicherzusammensetzung + 0 )* kapiere ich nicht.

P.S. der orignalcode ist von Karl heinz, nur bei mir heißen die 
Variablen anders

Könnte mir bitte jemand helfen?
#3883323
Lesenswert?

Zerleg die Zeilen in kleinere Teile und arbeite dich von innen nach 
außen vor.

Was heißt
1
x = speicherzusammensetzung_array[0]

Was bedeutet ein & (Achtung mehrere Bedeutungen)? Was liefert dir 
folgendes:
1
&speicherzusammensetzung + 0

Welche Bedeutung hat ein Datentyp in Klammern:
1
(uint8_t*)&speicherzusammensetzung

Gruß
Dennis
#3883328
Lesenswert?

Tho Wes schrieb:
> Servus,
>
> im ZUsammenhang einer SPI und der Zusammensetzung von 4 Bytes zu einem
> uint32_t frage ich mich, was genau  der code von Karl Heinz macht:
>
>
1
>   uint32_t speicherzusammensetzung;
2
> 
3
>   *( (uint8_t*)&speicherzusammensetzung + 0 ) 
4
> =speicherzusammensetzung_array[0];
5
>   *( (uint8_t*)&speicherzusammensetzung + 1 ) 
6
> =speicherzusammensetzung_array[1];
7
>   *( (uint8_t*)&speicherzusammensetzung + 2 ) 
8
> =speicherzusammensetzung_array[2];
9
>     *( (uint8_t*)&speicherzusammensetzung + 3 ) 
10
> =speicherzusammensetzung_array[3];
11
>   return speicherzusammensetzung;
12
> 
13
>
> insbesondere das **( (uint8_t*)* sowie das **(
> (uint8_t*)&speicherzusammensetzung + 0 )* kapiere ich nicht.
>
> P.S. der orignalcode ist von Karl heinz, nur bei mir heißen die
> Variablen anders
>
> Könnte mir bitte jemand helfen?

Also ein **((uint8_t*)* sehe ich nirgends im Code. Also vorsicht beim 
Zitieren.

Der Code macht folgendes:
1) &speicherzusammensetzung --> Zeiger auf diese Variable (32Bit).
2) (uint8_t*)&speicherzusammensetzung --> der Zeiger wird auf 8Bit-Wert 
gecastet, d.h zuvor war es ein Zeiger auf 32Bit, jetzt aber auf 8Bit.
3) ((uint8_t*)&speicherzusammensetzung + 0) --> Zeiger auf die ersten 
8Bit des 32Bit Wertes
4) *( (uint8_t*)&speicherzusammensetzung + 0 ) --> Dereferenzierung, 
d.h. ich greife auf die Daten an dieser Stelle zu.
5) *( (uint8_t*)&speicherzusammensetzung + 0 ) = 
speicherzusammensetzung_array[0]; --> das bekommst du jetzt auch hin.
Gast #3883415
Lesenswert?

Wer fabriziert eigentlich solchen Code? Warum nicht einfach:
1
uint32_t speicherzusammensetzung;
2
memcpy(&speicherzusammensetzung, &speicherzusammensetzung_array, 4);
3
return speicherzusammensetzung;
#3883449
Lesenswert?

sebi707 schrieb:
> Wer fabriziert eigentlich solchen Code? Warum nicht einfach:
>
1
> uint32_t speicherzusammensetzung;
2
> memcpy(&speicherzusammensetzung, &speicherzusammensetzung_array, 4);
3
> return speicherzusammensetzung;
4
>

Vielleicht weil es nicht sicher ist, dass die Bytes vom Array auch 
wirklich ohne Lücke hintereinander liegen...?
Oder um Zeigerarithmetik zu verdeutlichen?
Oder...
#3883459
Lesenswert?

Daniel V. schrieb:
> Peter Dannegger schrieb:
>>
1
>> uint8_t moeglichstlangervariablennameumdenleseroptimalzuverwirren;
2
>> uint8_t moeglichstaehnlichervariablennameumdenleseroptimalzuverwirren;
3
>>
>
> Von Peda hätte ich jetzt aber etwas mehr Verständnis erwartet...

Was Tho Wes da aufführt, hat nichts mehr mit Verständnis zu tun.
Man kann alles bis ins Absurde übertreiben. Auch das Prinzip von 
sprechenden Variablennamen. Und dann dreht sich die Verständlichkeit von 
Code ganz schnell ins Gegenteil.
Gast #3883507
Lesenswert?

Tho Wes schrieb:
> speicherzusammensetzung_array[0];

Wer solche Variablennamen wählt, hat offenbar keine Ahnung, wie man 
richtig programmiert. Korrekt wäre:

1
    #define natuerlichepositiveganzzahlnull 0
2

3
    leseundschreibspeicheraushalbleiteraufsiliziumbassierendzusammensetzung_eindimensionalesarrayausvorzeichenlosenbytewertenmitjeweilsachtbit[natuerlichepositiveganzzahlnull];

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