Liste von Zeigern auf Strings im Flash

OP #541217
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
#541415
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

#541466
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
#541518
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
Gast #541586
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

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