Forum: Mikrocontroller und Digitale Elektronik Verständisproblem Cast Ausdruck


von Frank Schwuch (Gast)


Lesenswert?

Hallo
Ich habe gerade ein Problem folgende Zeilen Code zu verstehen. Leider 
habe ich noch nicht viel Erfahrung mit C und konnte bisher nichts 
darüber finden, vielleicht suche ich aber auch mit den falschen 
Begriffen.

#define StartAdresse ((uint32_t)0xD0000000)

void Funktion1(uint32_t adr, uint8_t wert)
{
  *(uint8_t*) (StartAdresse  + adr) = wert;
}

Um welches Konstrukt handelt es sich bei " *(uint8_t*) "?
Ist das eine Cast Operation? Kombiniert mit einem Pointer?
Ich hoffe ihr könnt mir etwas auf die Sprünge helfen :(

LG Frank

von Karl M. (Gast)


Lesenswert?

Um einen uint8 Zeiger auf Daten und um dessen Zugriff (Wertzuweisung) 
auf das Byte an der übergebene Adresse+Basisadresse.

von -.-.- (Gast)


Lesenswert?

Karl M. schrieb:
> Um einen uint8 Zeiger auf Daten und um dessen Zugriff
> (Wertzuweisung)
> auf das Byte an der übergebene Adresse+Basisadresse.

Satzzeichen helfen manchmal... Aber er hat schon recht.

Du willst an die Addresse
1
StartAdresse  + adr

den Wert
1
wert

schreiben. Dazu musst du erst die Angegebene Addresse(die als Zahl 
angegeben ist) als Addresse casten
1
(uint8_t*) (StartAdresse  + adr)
und dann dereferenzieren, sodass du an diese Addresse den Wert schreibst
1
*(uint8_t*) (StartAdresse  + adr) = wert;

von Tom (Gast)


Lesenswert?

Ergänzung:
Wie immer in C muss man solche Ausdrücke häppchenweise von rechts nach 
links lesen.


           (StartAdresse  + adr)  nur eine Zahl.

 (uint8_t*)(StartAdresse  + adr)  die Zahl als Pointer auf ein
                                  uint8_t interpretieren.

*(uint8_t*)(StartAdresse  + adr)  dereferenzieren, also der Wert,
                                  auf den der Pointer zeigt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank Schwuch schrieb:
> #define StartAdresse ((uint32_t)0xD0000000)
>
> void Funktion1(uint32_t adr, uint8_t wert)
> {
>   *(uint8_t*) (StartAdresse  + adr) = wert;
> }

Ist gleichbedeutend mit
1
void Funktion1 (uint32_t offset, uint8_t wert)
2
{
3
    uint8_t *addr = (uint8_t*) StartAdresse;
4
    addr[offset] = wert;
5
}

von Frank Schwuch (Gast)


Lesenswert?

Danke für eure Antworten, leider ist mir das ganze noch nicht so ganz 
klar.

Müsste ich dann nicht auch folgendes schreiben können.
1
 
2
#define StartAdresse ((__int32)0xD0000000)
3
4
__int8 x = 0;
5
  
6
x = (__int8*)StartAdresse;  ???
7
8
oder 
9
10
x = &((__int8*)StartAdresse); ???

Und so wieder in x den Wert 0xD0000000 stehen haben?

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.