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!
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 | }
|
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.