Ich habe da ein kleines Verständnisproblem mit dem folgenden Code-Ausschnitt: Ich möchte mir ein Menü für ein LCD basteln mit dem ich in beinahe beliebige Anzahl Untermenüs hin und her wechseln kann. Dazu müsste ich mir natürlich das aktuelle Menü irgendwie merken, was mit der Variable cur_menu funktionieren soll. Allerdings schaffe ich es nicht die Variable auch nur mit einem der definierten Menü-Strukturen ohne das Werfen von Fehlern zu initialisieren. Die Strukturen funktionieren ansich (zumindestens ohne Fehler). Mir geht es nur um die Deklaration der Variable und deren Wertzuweisung. ================================================ typedef struct MENU_ENTRY { const unsigned char *text; int8_t prev; int8_t next; struct MENU_ENTRY *parent; struct MENU_ENTRY *sub; int8_t *value; int8_t max_value; void *(*fp)(void); } MENU_t; MENU_t *cur_menu[]; const MENU_t main_menu[]; const MENU_t config_menu[] PROGMEM = { { confmenu, -1, 1, (MENU_t*)main_menu, NULL, NULL, -1, NULL }, { sensor1, 0, 2, NULL, NULL, NULL, 1, NULL }, { sensor2, 1, 3, NULL, NULL, NULL, 1, NULL }, { sensor3, 2, 4, NULL, NULL, NULL, 1, NULL }, { sensor4, 3, 5, NULL, NULL, NULL, 1, NULL }, { sensor5, 4, 6, NULL, NULL, NULL, 1, NULL }, { sensor6, 5, 7, NULL, NULL, NULL, 1, NULL }, { sensor7, 6, 8, NULL, NULL, NULL, 1, NULL }, { sensor8, 7, 9, NULL, NULL, NULL, 1, NULL }, { limiter, 8, -1, NULL, NULL, NULL, -1, NULL } }; const MENU_t transfer_menu[] PROGMEM = { { trnsmenu, -1, 15, (MENU_t*)main_menu, NULL, NULL, -1, NULL }, { strtuart, 14, 16, NULL, NULL, NULL, -1, NULL }, //über UART senden { baud, 15, 17, NULL, NULL, NULL, 5, NULL }, { limiter, 16, -1, NULL, NULL, NULL, -1, NULL } }; const MENU_t main_menu[] PROGMEM = { { mainmenu, -1, 1, NULL, NULL, NULL, -1, NULL }, { config, 0, 2, NULL, (MENU_t*)config_menu, NULL, -1, NULL }, { transfer, 1, 3, NULL, (MENU_t*)transfer_menu, NULL, -1, NULL }, { limiter, 2, -1, NULL, NULL, NULL, -1, NULL } }; [...] *cur_menu = (MENU_t*)pgm_read_word(&main_menu);
Moin Tobias, etwas schwer, sich da auf die Schnelle hineinzudenken, aber sollte es nicht heissen: MENU_t *cur_menu; ... cur_menu = pgm_read_word(&main_menu); Wenn pgm_read_word richtig deklariert ist, sollte der cast unnötig sein - falls es nicht eine Funktion aus einem anderen Context ist, die/den ich nicht kenne. Eine Compiler-Warnung ist da eher Zeichen eines vergessenen oder falschen Prototyps. Was ich auch nicht verstehe: Warum übergibst Du die Adresse des Menüs? Als Feld ist es doch bei der Übergabe sowieso ein Zeiger. Wenn Du noch etwas mehr von Deinen Pgm postest, will ich es mir gern noch einmal anschauen - denn mit einem ähnlichen Menüsystem gehe ich auch gerade 'schwanger'. Gruß, 73, Jens
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.