www.mikrocontroller.net

Forum: Compiler & IDEs Liste von Zeigern auf Strings im Flash


Autor: Rene Zimmermann (renezimmermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein paar Strings im Flash:
static uint8_t adr_00000[] PROGMEM = "Broadcast";
static uint8_t adr_00001[] PROGMEM = "Zimmer 01";
static uint8_t adr_00002[] PROGMEM = "Zimmer 02";
static uint8_t adr_00003[] PROGMEM = "Zimmer 03";
static uint8_t adr_00004[] PROGMEM = "Zimmer 10";
static uint8_t adr_00005[] PROGMEM = "Zimmer 11";
static uint8_t adr_00006[] PROGMEM = "Zimmer 12";
static uint8_t adr_00007[] PROGMEM = "Zimmer 21";
static uint8_t adr_00008[] PROGMEM = "Zimmer 22";
static uint8_t adr_00009[] PROGMEM = "Zimmer 23";
static uint8_t adr_00010[] PROGMEM = "Zimmer 25";
static uint8_t adr_00011[] PROGMEM = "Zimmer 27";
static uint8_t adr_00012[] PROGMEM = "Zimmer 29";
static uint8_t adr_00013[] PROGMEM = "Zimmer 32";
static uint8_t adr_00014[] PROGMEM = "Zimmer 34";
static uint8_t adr_00015[] PROGMEM = "Zimmer 44";
static uint8_t adr_00016[] PROGMEM = "Zimmer 45";
static uint8_t adr_00017[] PROGMEM = "Zimmer 46";
static uint8_t adr_00018[] PROGMEM = "Zimmer 48";
static uint8_t adr_00019[] PROGMEM = "Zimmer 49";

nun möchte ich ein Array von Zeigern auf die Strings anlegen:
static uint8_t *padressen[] PROGMEM = {&adr_00000, &adr_00001, &adr_00002, &adr_00003, &adr_00004, 
          &adr_00005, &adr_00006, &adr_00007, &adr_00008, &adr_00009,
          &adr_00010, &adr_00011, &adr_00012, &adr_00013, &adr_00014,
          &adr_00015, &adr_00016, &adr_00017, &adr_00018, &adr_00019};

leider bekomme ich immer folgende Warnung:
warning: initialization from incompatible pointer type

aber sowohl die Strings als auch das Zeigerarray sind doch vom Typ 
'uint8_t', oder Irre ich hier? Außerdem finde ich das nicht sehr Elegant 
gelöst da bei jedem String der hinzukommt ja auch das Zeigerarry 
bearbeitet werden muß. Wie würdet ihr das Problem lösen?

Gruß Rene

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Die Zeiger in deinem Array müssen auch vom Typ "PROGMEM const uint8_t *" 
sein...

&adr_00000 ist ausserdem ein Pointer auf ein char array, nicht ein 
"char*".

/Ernst

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rene Zimmermann

Ich denke es muss so aussehen

static PROGMEM uint8_t *padressen[]  = {adr_00000, adr_00001, adr_00002, 
adr_00003, adr_00004,
          adr_00005, adr_00006, adr_00007, adr_00008, adr_00009,
          adr_00010, adr_00011, adr_00012, adr_00013, adr_00014,
          adr_00015, adr_00016, adr_00017, adr_00018, adr_00019};

MFG
Falk


Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, vielleicht dann doch eher so?

PGM_P padressen[]  = {adr_00000, adr_00001, adr_00002, adr_00003, 
adr_00004,
          adr_00005, adr_00006, adr_00007, adr_00008, adr_00009,
          adr_00010, adr_00011, adr_00012, adr_00013, adr_00014,
          adr_00015, adr_00016, adr_00017, adr_00018, adr_00019};

MFG
Falk

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Hmm, vielleicht dann doch eher so?
>
> PGM_P padressen[]  = {adr_00000, adr_00001, adr_00002, adr_00003,

Es muss mindestens zweimal "PROGMEM" (bzw PGM) vorkommen, es soll ja
a) das Array selbst im Flash Liegen
b) und Pointer auf Strings im Flash enthalten.

also
PGM_P padressen[] PROGMEM = {
    addr_00000,addr_0001....
};

Ansonsten wirklich mal die AVR-libc FAQ zu dem Thema durchlesen, da ist 
dann auch ein Beispiel dabei, wie man's wieder ausliest:

http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

/Ernst

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Außerdem finde ich das nicht sehr Elegant
>gelöst da bei jedem String der hinzukommt ja auch das Zeigerarry
>bearbeitet werden muß. Wie würdet ihr das Problem lösen?

Mit dreimal P... :


PGM_P padressen[][10] PROGMEM = {
    PSTR("Broadcast"),
    PSTR("Zimmer 1")
};


Oliver

Autor: Rene Zimmermann (renezimmermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für eure zahlreiche Hilfe.

Gruß Rene

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.