Array aus Elementen von const char * const stringArray[] PROGMEM = {.};

Gast #2464959
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!
Persönliche Seite #2465271
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
}
Persönliche Seite #2465296
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

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