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
Um einen uint8 Zeiger auf Daten und um dessen Zugriff (Wertzuweisung) auf das Byte an der übergebene Adresse+Basisadresse.
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; |
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.
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.