Forum: Compiler & IDEs Pointerzuweisung


von Matthias (Gast)


Lesenswert?

1
//global:
2
const uint8_t Welcome_text1[] PROGMEM = "Hallo Welt"
3
..
4
//lokal in main:
5
uint8_t    *temp_pointer  = &Welcome_text1;
6
..
7
temp_data = pgm_read_byte ( temp_pointer++ )
8
..

bringt eine Warnung bei der lokalen initialisierung von temp_pointer...
Es funktioniert aber... Was mache ich falsch??
"warning: initialization from incompatible pointer type"


Danke schonmal

von Mork (Gast)


Lesenswert?

Mit "temp_pointer  = &Welcome_text1;" speicherst Du die Adresse des 
Zeigers "Welcome_text1" im "temp_pointer" ab. "temp_pointer" ist aber 
ein Zeiger auf einen uint8_t, und nicht ein Zeiger auf einen Zeiger auf 
einen uint8_t. Mach das '&' bei "..= &Welcome_text1;" weg, dann passts.

MfG Mark

von Matthias (Gast)


Lesenswert?

Danke schonmal für die Antwort.
Das habe ich auch vor:
 Die Variable "temp_pointer" soll auch die Adresse auf den im Flash 
untergebrachten Welcome_Text1 beinhalten, um dann schrittweise durch 
diesen Text zu gehen. Die Fkt. pgm_read_byte erwartet als Argument einen 
Pointer auf ein Byte. Deshalb diese Umsetzung.

Lasse ich, wie angeraten, das & bei der Initialisierung weg, folgt:
"warning: initialization discards qualifiers from pointer target type"

Aber er erzeugt denselben ASM-Quellcode. SOllte also auch funktionieren
(Kanns grad ne testen, Hardware nicht da)

Aber wie ist das sauber zu lösen??

von Karl H. (kbuchegg)


Lesenswert?

Matthias wrote:
> Danke schonmal für die Antwort.
> Das habe ich auch vor:
>  Die Variable "temp_pointer" soll auch die Adresse auf den im Flash
> untergebrachten Welcome_Text1 beinhalten, um dann schrittweise durch
> diesen Text zu gehen. Die Fkt. pgm_read_byte erwartet als Argument einen
> Pointer auf ein Byte. Deshalb diese Umsetzung.
>
> Lasse ich, wie angeraten, das & bei der Initialisierung weg, folgt:
> "warning: initialization discards qualifiers from pointer target type"
>
> Aber er erzeugt denselben ASM-Quellcode. SOllte also auch funktionieren
> (Kanns grad ne testen, Hardware nicht da)
>
> Aber wie ist das sauber zu lösen??

Indem du berücksichtigst, dass das Array (und damit der
zwischendurch generierte Pointer) eben kein normales Array
ist, sondern eines das mittels PROGMEM ins Flash geschoben
wurde.
Ergo ist der Pointer auch kein normaler Pointer (welcher ins
RAM zeigt), sondern einer der ins FLASH zeigt und die Daten
die dort abgelegt sind, sind als Konstante zu betrachten.

Reicht dir das als Hinweis?

von Rolf Magnus (Gast)


Lesenswert?

> Mit "temp_pointer  = &Welcome_text1;" speicherst Du die Adresse des
> Zeigers "Welcome_text1" im "temp_pointer" ab.

Nein. Welcome_text1 ist ein Array, kein Zeiger! Es wird die Adresse des 
Arrays gespeichert. Das funktioniert, weil die Array-Startadresse 
natürlich dieselbe ist wie die seines ersten Zeichens. Der Typ ist aber 
verschieden (Zeiger auf Array[9] aus char vs. Zeiger auf char).

> Indem du berücksichtigst, dass das Array (und damit der
> zwischendurch generierte Pointer) eben kein normales Array
> ist, sondern eines das mittels PROGMEM ins Flash geschoben
> wurde.

Das tut er ja eigentlich durch das pgm_read_byte. Was er ignoriert, sind 
die "qalifiers", wie der Compiler schon richtig anmerkt. Wäre das Array 
im RAM, käme dieselbe Warnung.

Qualifiers sind übrigens "const" und "volatile".

von Matthias (Gast)


Lesenswert?

Ja das leuchtet ein.
Aber wie bekomme ich diese Meldung nun weg?

von Karl H. (kbuchegg)


Lesenswert?

Matthias wrote:
> Ja das leuchtet ein.
> Aber wie bekomme ich diese Meldung nun weg?

Dann hat es doch nicht so eingeleuchtet:

const uint8_t * temp_pointer  = Welcome_text1;

Schliesslich zeigt ja temp_pointer auf einen uint8_t
welcher konstant ist.

Und genau das möchte dir der Compiler die ganze Zeit sagen

von Matthias (Gast)


Lesenswert?

Ja, es war nicht hell genug ;-)

Ohne dem const also...
Sehr schön.
Danke Danke Danke

Matthias

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.