Hallo,
Danke erstmal.
Ich glaube, ich hab mich falsch ausgedrückt.
Sprinter, bei Deinem Beispiel klappt das, weil der Compiler die Adressen direkt einsetzen kann ? Kann das sein ?
Ich meine Hier:
Code:
feld[0]();
feld[1]();
Die Adressen stehen zu Kompilierzeit fest und müßen nicht im laufendem Betrieb geholt werden.
Ich glaube, wenn man eine Variable bei dem Arrays verwenden würde würde es nicht klappen ?
Aber nochmal ein Beispiel:
Ich habe ein paar Strings in Flash gelegt:
Code:
const char menuhauptstr[] PROGMEM = "Hauptmenu";
const char menukontstr[] PROGMEM = "Kontrast";
const char menuhellstr[] PROGMEM = "Helligkeit";
const char menufrage[] PROGMEM = "Speichern ? ";
dann eine Struktur :
Code:
struct MENU {
const char *Menu_Name;
uint8_t Entrie_up;
uint8_t Entrie_down;
uint8_t Entrie_right;
uint8_t Entrie_left;
void(*Menu_Funkt)(void);
};
Zum Schluß ein Array mit diesen Strukturen im Flash:
Code:
const struct MENU menu[] PROGMEM = {
{menuhauptstr,3,1,10,15,Draw_Main},
{menuhellstr,0,2,10,15,Draw_Hell},
{menukontstr,1,3,10,15,NULL},
{menufrage,2,0,1,0,NULL}
};
Will ich jetzt z.B. mit:
Code:
menu[i].Menu_Funkt();
Meine Funktion aufrufen, klappt das nicht.
Ich habe gelesen, daß man sich die Adresse zuerst mit (const char *)pgm_read_word(menu) holen muß, nur irgendwie krieg ich das nicht hin
Ich hab es jetzt so gelöst, daß ich mein Array in RAM gelegt habe, dann geht alles wunderbar.
Ich glaub, entweder hab ich den Kapitel über Pointer bei Kernighan u. Ritchie oder die Harvald Architektur nicht verstanden.
Gruß Sebastian
Lesezeichen