Возможно, я слишком усложняю это.
Я пытаюсь создать довольно многоразовую систему иерархических меню для встроенного приложения в C на Arduino.У меня есть структуры для представления различных типов пунктов меню, включая те, которые являются подменю, и объединение этих элементов в общий пункт меню.Массив пунктов меню - это один уровень меню.Запись подменю имеет указатель на другой массив пунктов меню.
Проблема в том, что запись подменю является членом объединения, поэтому ее необходимо определить до объединения.Но у него есть указатель на массив экземпляров этого объединения, что приводит к ошибке компиляции, потому что объединение еще не определено.
Есть ли безопасный способ решения этой проблемы или мой указатель находится в записи подменюдолжна быть пустота *?
Код:
typedef enum {UI_STATE_HOME, UI_STATE_MENU, UI_STATE_DIALOG} te_UIState;
typedef enum {UI_ENTRY_SUBMENU, UI_ENTRY_NUMERIC_INT, UI_ENTRY_NUMERIC_FLOAT, UI_ENTRY_BOOL, UI_ENTRY_DISCRETE} te_UIEntryType;
/* Typedefs for the different types of entry
*
*/
typedef struct {
char* entryName; // pointer to one of our string entries, eg MNU_Light
te_UIEntryType entryType;
} tsEntry;
typedef struct {
char* entryName;
te_UIEntryType entryType;
int (* finalIntHandler)(int selectedValue); //The function that should be called when a number has been selected
int (* initialIntValue) (); //The function that should be called to obtain the starting value for the selector
} ts_EntryInt;
typedef struct {
char* entryName;
te_UIEntryType entryType;
int (* finalIntHandler)(float selectedValue);
float (* initialSingleValue) ();
} ts_EntrySingle;
typedef struct {
char* entryName;
te_UIEntryType entryType;
int (* finalIntHandler)(bool selectedValue);
bool (* initialBoolValue) ();
} ts_EntryBool;
typedef struct {
char* entryName;
te_UIEntryType entryType;
int (* handler)();
char* (* optionalEntryNamePtrFunction)(); //If this points to a function, it'll be called to determine what text to display as the entry name.
// This is for things like enable/disable where the text changes depending on the present state.
} ts_EntryDiscrete;
typedef struct {
char* entryName;
const te_UIEntryType entryType = UI_ENTRY_SUBMENU;
void *entries[];
} ts_EntrySubmenu;
typedef union
{
tsEntry entry;
ts_EntryInt entryInt;
ts_EntrySingle entrySingle;
ts_EntryBool entryBool;
ts_EntryDiscrete entryDiscrete;
ts_EntrySubmenu entrySubmenu;
} tuEntry;