Forum: Mikrocontroller und Digitale Elektronik Code lese problem


von Tho W. (tommyprog)


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?

von Max H. (hartl192)


Lesenswert?

Tho Wes schrieb:
> insbesondere das **( (uint8_t*)* sowie das **(
> (uint8_t*)&speicherzusammensetzung + 0 )* kapiere ich nicht.
Beschäftige dich am Besten mal mit Pointer...

von Dennis S. (eltio)


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

von Daniel V. (danvet)


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.

von sebi707 (Gast)


Lesenswert?

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

von Tho W. (tommyprog)


Lesenswert?

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

Das erste * wäre auch für den fettdruck, das zweite * ebenso.

Danke Dir für den Tipp ^^

von Peter D. (peda)


Lesenswert?

1
uint8_t moeglichstlangervariablennameumdenleseroptimalzuverwirren;
2
uint8_t moeglichstaehnlichervariablennameumdenleseroptimalzuverwirren;

von Daniel V. (danvet)


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...

von Daniel V. (danvet)


Lesenswert?

Peter Dannegger schrieb:
>
1
> uint8_t moeglichstlangervariablennameumdenleseroptimalzuverwirren;
2
> uint8_t moeglichstaehnlichervariablennameumdenleseroptimalzuverwirren;
3
>

Von Peda hätte ich jetzt aber etwas mehr Verständnis erwartet...

von Marc (Gast)


Lesenswert?

Daniel V. schrieb:
> Vielleicht weil es nicht sicher ist, dass die Bytes vom Array auch
> wirklich ohne Lücke hintereinander liegen...?

Selbstverständlich tun sie das.

von Karl H. (kbuchegg)


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.

von Chef-Programmierer (Gast)


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];

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.