XC8-Compiler-Array mit Strukturinitialisierungsproblem

Ich verwende MPLAB X IDE mit XC8-Compiler und möchte ein Menüsystem für ein GLCD-Modul erstellen, aber ich habe Probleme beim Initialisieren meines MainMenuItemsList[]Arrays. Beim Kompilieren erhalte ich keinen Fehler, aber wenn ich das Projekt debugge, kann ich sehen, dass nur das erste Element initialisiert wird. Was kann die Ursache sein?

Hier ist das relevante Codefragment:

typedef struct menuitem
{
  char ItemName[10];
  void (*handler)(void);
  struct menu *ChildSubMenu;
}MenuItem;

typedef struct menu
{
  char MenuName[10];
  char NumberItems;
  //struct menu *ParentMenu;
  MenuItem *Items[12];
}Menu;

MenuItem MainMenuItemsList[12] = {  {"SubMenu1", NULL, NULL},
                                    {"SubMenu2", NULL, NULL},
                                    {"SubMenu3", NULL, NULL},
                                    {"SubMenu4", NULL, NULL},
                                    {"SubMenu5", NULL, NULL},
                                    {"SubMenu6", NULL, NULL},
                                    {"SubMenu7", NULL, NULL},
                                    {"SubMenu8", NULL, NULL},
                                    {"SubMenu9", NULL, NULL},
                                    {"SubMenu10", NULL, NULL},
                                    {"SubMenu11", NULL, NULL},
                                    {"SubMenu11", NULL, NULL}
                                };

Menu MainMenu = {"MainMenu",12,&MainMenuItemsList};
Woher wissen Sie, dass das Array nicht korrekt initialisiert wird? Haben Sie auf einem tatsächlichen LCD getestet? Einige der neueren Versionen von MPLAB X zeigen nicht die korrekten Werte im Überwachungsfenster an.
Ja ich habe es getestet. Die Strings "MainMenu" und "SubMenu1" werden korrekt auf das LCD geschrieben, aber die anderen Arrays ItemName[10] sind voll mit Nullzeichen anstelle von SubMenu2...11. (Übrigens verwende ich MPLAB X v2.15)
Es funktioniert nicht, weil ich eine Liste von Strukturen benötige, aus der ich das erste Element auswähle und den Namen davon (SubMenu1) auf den Bildschirm schreibe, dann das zweite Element auswähle usw. Das erscheint in meinem Code so: And the call void drawMenu(Menu *menuToShow, unsigned char selectedIndex) { ... glcd_puts(menuToShow->Items[i]->ItemName,8,i+1,0,1,-2); ... }of die Funktion: drawMenu(&MainMenu, 0);Entschuldigung, aber ich weiß nicht, wie man den Codeblock richtig formatiert, aber ich habe es mehrmals versucht.
Hat niemand eine Idee? Das habe ich auch probiert, hat aber nicht funktioniert. Verknüpfung

Antworten (1)

Wenn Sie definieren, MenuItem *Items[12];erstellen Sie ein Array von Adressen, keine Adresse für ein Array von Strukturen (was Sie wollen).

nimm die "[12]" heraus:

typedef struct menu
{
  char MenuName[10];
  char NumberItems;
  MenuItem * Items;
}Menu;