www.mikrocontroller.net

Forum: Compiler & IDEs Pointerzuweisung


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//global:
const uint8_t Welcome_text1[] PROGMEM = "Hallo Welt"
..
//lokal in main:
uint8_t    *temp_pointer  = &Welcome_text1;
..
temp_data = pgm_read_byte ( temp_pointer++ )
..

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

Autor: Mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das leuchtet ein.
Aber wie bekomme ich diese Meldung nun weg?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, es war nicht hell genug ;-)

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

Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.