Forum: PC-Programmierung Pointer chaos (Interpretations-Problem)


von Roman G. (mastershybby)


Lesenswert?

Hallo zusamman,

ich habe ein kleines Problem beim interpretieren des folgenden codes:

#define FLASH_PROGRAM_ADDR(x) \
  (*(volatile unsigned long *)(void *)(&__IPSBAR[(0x04000000 + (x))]))

was geschieht da genau?? kann mir da vielleicht jemand helfen?
Vielen Dank!

Gruss
Roman

von Uhu U. (uhu)


Lesenswert?

&__IPSBAR[(0x04000000 + (x))] ergibt die Adresse des Array-Elementes
   0x04000000 + (x)

(void *) (&__IPSBAR[(0x04000000 + (x))]) erzeugt einen void-Pointer
   auf die Adresse

(volatile unsigned long *)(void *)(&__IPSBAR[(0x04000000 + (x))]) castet
   den void-Pointer in einen volatile unsigned long Pointer um

(*(volatile unsigned long *)(void *)(&__IPSBAR[(0x04000000 + (x))]))
   dereferenzeirt den Pointer, d.h. es gibt den Inhalt der Adresse
   zurück, auf die der Pointer zeigt.

von Roman G. (mastershybby)


Lesenswert?

hallo uhu,

vielen dank für die sofortige hilfe!
aber nun kommt die frage warum ist es von vorteil zuerst ein 
Void-Pointer zu machen und diesen dann in einen volatile unsigned long 
pointer zu casten? wäre da ein einfacher volatile unsigned long pointer 
nicht möglich?

Gruss
Roman

von Uhu U. (uhu)


Lesenswert?

Ich vermute mal, daß unter C++ ein Cast vom typ von __IPSBAR nach 
volatile unsigned long * unzulässig ist.

Versuch doch einfach mal, den (void *)-Cast wegzulassen...

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.