Hallo,
ich habe momentan eher eine Verständnisfrage als ein Problem, denn
funktionieren tut mein Code.
Ich habe einen unsigned 32 Bit Integer. Woher dieser kommt ist
nebensächlich. Zum Beispiel könnten die einzelnen Byte per USART
übertragen werden.
Interessant ist eher die Interpretation dieses Zahlenwertes: ich nehme
an es handelt sich um eine Adresse im Speicher und will sehen, was an
dieser Stelle steht.
Dazu soll eine Funktion einen Pointer liefern, der auf diese Adresse
zeigt.
Momentan schaut die Funktion so aus und funktioniert auch:
1 | uint8_t *GetPointer(uint32_t addr)
|
2 | {
|
3 | uint8_t *ptr;
|
4 | ptr = addr;
|
5 | return ptr;
|
6 | }
|
Benutzt wird sie zB so:
1 | uint32_t addr_int = 0xFFFF1234;
|
2 | uint8_t *addr_ptr = GetPointer(addr_int);
|
Wie gesagt, funken tuts so.
Mich interessiert aber die Warnung, die der Compiler in der Zeile "ptr =
addr;" ausgibt:
1 | assignment makes pointer from integer without a cast
|
Ok, die Meldung ist noch verständlich. Füge ich einen Cast hinzu: "ptr =
(uint8_t *) addr;" gibt er diese Meldung aus:
1 | cast to pointer from integer of different size
|
Hier versteh ichs nicht mehr.
Ich sage dem Compiler, er soll die Zahl, die er in "addr" findet, als
Adresse eines 8Bit Wertes interpretieren.
Wieso meckert er mir hier die Größe an? Die Größe eines Zeigers ist ja
vom Adressbus abhängig, nicht von der Größe des Wertes, auf den er
zeigt.
Beispiel: auf einer 16 Bit Maschine ist ein Zeiger auch dann 16Bit groß,
wenn er auf ein "unsigned long long" zeigt.
Es handelt sich dabei übrigens momentan um einen 8 Bit AVR.
Ich speichere die Adresse dennoch als 32 Bit Int um
a) kompatibel zu bleiben zu anderen Prozessoren
b) im Map File der erzeugten Binärdatei werden die Adressen auch als 32
Bit Wert angegeben. Das kommt wohl vom gcc, der eher für den PC Einsatz
gedacht ist und führt zu Spiegelbildern im Speicher, die aber nicht
stören.
Kann mir jemand erklären, wieso der Compiler meckert und wie ich casten
sollte, um die Warning zu beseitigen?
Nochmal, mir gehts hier primär ums "Warum?", denn funktionieren tut
alles...
Grüße,
Rudi