Addition von #define
-
Hallo zusammen,
ich habe hier ein kleines Verständnisproblem und hoffe, es kann mir jemand von euch helfen.
Ich habe ein #define für eine Basis-Adresse:
#define BASE_ADDRESS 0x50000000
Darauf aufbauend möchte ich nun eine Adresse definieren, die auf der Basis-Adresse aufbaut. Hier kommt nur mein Problem in's Spiel.
Ich habe das auf zwei Varianten gemacht:
Variante 1:
#define ADDRESS 0x50000000 + 0x00000100
int* ptr;
ptr = (int*)ADDRESS;Variante 2:
#define ADDRESS (0x50000000 + 0x00000100)
unsigned long* ptr;
ptr = (int*)ADDRESS;Die beiden Varianten unterscheiden sich also nur in den Klammern beim #define.
Wenn ich mir nun mitprintf("ptr-address: 0x%x", ptr);
die Adresse ausgeben lasse, auf die "ptr" Zeigt, dann habe ich zwei unterschiedliche Ausgaben:
Variante 1:
ptr-address: 0x50001000Variante 2:
ptr-address: 0x50000100Kann mir das jemand erklären?
-
ups - der Pointer in Variante 2 sollte eigentlich auch ein int-Pointer sein.

Also:Variante 2:
#define ADDRESS (0x50000000 + 0x00000100)
int* ptr;
ptr = (int*)ADDRESS;
-
Ja, das ist ein sehr häufiges Problem, das man mit Makros hat. In C++ solltest du dafür lieber Konstanten verwenden:
const int ADDRESS = 0x50000000 + 0x00000100;Denn die Variante ohne Klammern expandiert zu:
int* ptr; ptr = ((int*) 0x50000000) + 0x00000100;Das heißt der erste Wert (0x50000000) wird zunächst in eine Adresse gecastet und dann um 100 erhöht.
Während bei der Variante mit Klammern zunächst beide Werte addiert und erst danach in eine Adresse gecastet werden:
int* ptr; ptr = (int*) (0x50000000 + 0x00000100);
-
jhkhjk schrieb:
int* ptr; ptr = ((int*) 0x50000000) + 0x00000100;Das stimmt so nicht ganz. Es expandiert zu
int* ptr; ptr = (int*) 0x50000000 + 0x00000100;Makros sind nur dumme Textersetzung, d.h. alle ADDRESS werden durch die im define folgende Zeichenkette ersetzt.
-
Erstmal vielen Dank für eure Antworten.
@manni66:
Aber warum geht es dann schief?
-
Achso - es ist also trotdzem der Fall, dass 0x50000000 in eine Adresse gecastet und anschließend um 100 erhöht wird.
Ist das so richtig?
-
ape4711 schrieb:
Achso - es ist also trotdzem der Fall, dass 0x50000000 in eine Adresse gecastet und anschließend um 100 erhöht wird.
Ist das so richtig?um 0x100, ja. Ist aber auch egal, nimm Konstanten an Stelle von #defines, und ales wird gut. Du sparst dir damit auch jede Menge anderer Scherereien. (Glaubs mir, ich hab auf Arbeit in den letzten Wochen genug Zeit mit den Auswirkungen einer Projektweiten #define-Seuche zu tun gehabt...)
-
Bei der Variante ohne Klammern wird der Wert des Pointers (0x5000...) nicht um 0x100 erhöht, sondern um 0x100 * sizeof(int).
-
Richtig, du hast Recht.
... um 0x100 Pointerelemente eben.
Jetzt hab ich's komplett gecheckt!
Vielen Dank für eure Hilfe!