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


von Rene Z. (renezimmermann)


Lesenswert?

Hallo,

ich habe ein paar Strings im Flash:
1
static uint8_t adr_00000[] PROGMEM = "Broadcast";
2
static uint8_t adr_00001[] PROGMEM = "Zimmer 01";
3
static uint8_t adr_00002[] PROGMEM = "Zimmer 02";
4
static uint8_t adr_00003[] PROGMEM = "Zimmer 03";
5
static uint8_t adr_00004[] PROGMEM = "Zimmer 10";
6
static uint8_t adr_00005[] PROGMEM = "Zimmer 11";
7
static uint8_t adr_00006[] PROGMEM = "Zimmer 12";
8
static uint8_t adr_00007[] PROGMEM = "Zimmer 21";
9
static uint8_t adr_00008[] PROGMEM = "Zimmer 22";
10
static uint8_t adr_00009[] PROGMEM = "Zimmer 23";
11
static uint8_t adr_00010[] PROGMEM = "Zimmer 25";
12
static uint8_t adr_00011[] PROGMEM = "Zimmer 27";
13
static uint8_t adr_00012[] PROGMEM = "Zimmer 29";
14
static uint8_t adr_00013[] PROGMEM = "Zimmer 32";
15
static uint8_t adr_00014[] PROGMEM = "Zimmer 34";
16
static uint8_t adr_00015[] PROGMEM = "Zimmer 44";
17
static uint8_t adr_00016[] PROGMEM = "Zimmer 45";
18
static uint8_t adr_00017[] PROGMEM = "Zimmer 46";
19
static uint8_t adr_00018[] PROGMEM = "Zimmer 48";
20
static uint8_t adr_00019[] PROGMEM = "Zimmer 49";

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

leider bekomme ich immer folgende Warnung:
1
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

von Εrnst B. (ernst)


Lesenswert?

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array

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

von Falk B. (falk)


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


von Falk B. (falk)


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

von Εrnst B. (ernst)


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
1
PGM_P padressen[] PROGMEM = {
2
    addr_00000,addr_0001....
3
};

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.html#faq_rom_array

/Ernst

von OliverSo (Gast)


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

von Rene Z. (renezimmermann)


Lesenswert?

Hallo,

vielen Dank für eure zahlreiche Hilfe.

Gruß Rene

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.