Pointerzuweisung

Gast #537954
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
Gast #537963
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
Gast #538151
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??
#538173
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?
Gast #538226
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".
#538718
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren