Forum: Compiler & IDEs Array aus Elementen von const char * const stringArray[] PROGMEM = {.};


von riki (Gast)


Lesenswert?

Hallo

 Ich versuche mich gerade an einem Weihnachtsgeschenk das diverse 
Textbausteine zusammen setzen kann. Leider bin ich an einen Punkt 
gekommen an dem ich nicht mehr alleine weiter weiß. Nach erfolglosem 
Rumprobieren und AVR-GCC-Tutorial lesen sowie Webseiten durchsuchen 
hoffe ich nun auf Hilfe von Euch.

Ich habe zum Beispiel sowas gegeben:

const char str_a1[] PROGMEM = "first_A";
const char str_a2[] PROGMEM = "second_A";
const char str_a3[] PROGMEM = "third_A";
const char * const strarrayA[] PROGMEM = { str_a1, str_a2, str_a3 };

const char str_b1[] PROGMEM = "first_B";
const char str_b2[] PROGMEM = "second_B";
const char str_b3[] PROGMEM = "third_B";
const char * const strarrayB[] PROGMEM = { str_b1, str_b2, str_b3 };

Nun würde ich gerne ein weiteres Array Names arrayOfstrarray[] 
definieren was strarrayA und strarrayB als Elemente hat.

 Wie geht das?

Die Anschlußfrage ist dann wie ich z.B. auf das Char 'd' im String 
"secound_B" zugreife von arrayOfstrarray[] aus. Auch ist es für mich 
wichtig die Anzahl der Elemente von z.B. arrayOfstrarray[1] zu erfahren.

 Vielen Dank!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
#include <avr/pgmspace.h>
2
3
const char str_a0[] PROGMEM = "first_A";
4
const char str_a1[] PROGMEM = "second_A";
5
const char str_a2[] PROGMEM = "third_A";
6
const char* const strarrayA[] PROGMEM = { str_a0, str_a1, str_a2 };
7
8
const char str_b0[] PROGMEM = "first_B";
9
const char str_b1[] PROGMEM = "second_B";
10
const char str_b2[] PROGMEM = "third_B";
11
const char* const strarrayB[] PROGMEM = { str_b0, str_b1, str_b2 };
12
13
const char* const * const arrayOfstrarray[] PROGMEM =
14
{
15
    strarrayA, strarrayB
16
};
17
18
char get_d (void)
19
{
20
    const char * const * strarray 
21
        = (const char* const*) pgm_read_word (& arrayOfstrarray[1]);
22
    const char * str
23
        = (const char*) pgm_read_word (& strarray[1]);
24
    char d
25
        = (char) pgm_read_byte (& str[5]);
26
        
27
    return d;
28
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Und in 4.7 geht auch:
1
#define PGM_STR(X) ((const __pgm char[]) { X })
2
3
const __pgm char* __pgm const strarrayA[] =
4
{
5
    PGM_STR ("first_A"),
6
    PGM_STR ("second_A"),
7
    PGM_STR ("third_A")
8
};
9
10
const __pgm char* __pgm const strarrayB[] =
11
{
12
    PGM_STR ("first_B"),
13
    PGM_STR ("second_B"),
14
    PGM_STR ("third_B")
15
};
16
17
const __pgm char* __pgm const* __pgm const arrayOfstrarray[] =
18
{
19
    strarrayA, strarrayB
20
};
21
22
char get_d (void)
23
{
24
    return arrayOfstrarray[1][1][5];
25
}
 
 
Sowie
 
 
1
#define PGM_STR(X) ((const __pgm char[]) { X })
2
3
const __pgm char* __pgm const strarray[][3] =
4
{
5
    {
6
        PGM_STR ("first_A"),
7
        PGM_STR ("second_A"),
8
        PGM_STR ("third_A")
9
    },
10
    {
11
        PGM_STR ("first_B"),
12
        PGM_STR ("second_B"),
13
        PGM_STR ("third_B")
14
    }
15
};
16
17
char get_n (void)
18
{
19
    return strarray[1][1][4];
20
}
 
 
 
Und wenn man Platz genug hat und die Maximallänge der Strings kennt
 
 
 
1
const char __pgm strarray2[][3][9] =
2
{
3
    {  "first_A", "second_A", "third_A"  },
4
    {  "first_B", "second_B", "third_B"  }
5
};
6
7
char get_B (void)
8
{
9
    return strarray2[1][1][7];
10
}

In dem Fall sieht get_B dann so aus:
1
get_B:
2
  ldi r24,lo8(66)
3
  ret

von riki (Gast)


Lesenswert?

Vielen lieben Dank Johann! Das ist wirklich spitze.

Ansonsten freue ich mich schon auf ein stabiles 4.7.

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.