Alex_Golubev 0 12 мая, 2017 Опубликовано 12 мая, 2017 (изменено) · Жалоба Привет. Столкнулся с проблемой при написание микроменю. Не вызывает функцию void Language (void) по указателю. menu.h #ifndef _MENU_H_ #define _MENU_H_ #define NULL_ENTRY Null_Menu #define NULL_FUNC (void*)0 #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Selectf, Enterf, Text_RUS,Text_ENG) \ extern const menuItem Next; \ extern const menuItem Previous; \ extern const menuItem Parent; \ extern const menuItem Child; \ const menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, (FuncPtr)Selectf, (FuncPtr)Enterf, { Text_RUS }, { Text_ENG }} #define PREVIOUS ((menuItem*)(selectedMenuItem->Previous)) #define NEXT ((menuItem*)(selectedMenuItem->Next)) #define PARENT ((menuItem*)(selectedMenuItem->Parent)) #define CHILD ((menuItem*)(selectedMenuItem->Child)) #define SELECT (selectedMenuItem->Select) #define SELECTFUNC ((FuncPtr)(selectedMenuItem->SelectFunc)) #define ENTERFUNC ((FuncPtr)(selectedMenuItem->EnterFunc)) #define NULL_ENTRY Null_Menu // Typedefs: typedef void (*FuncPtr)(void); typedef struct { void *Next; void *Previous; void *Parent; void *Child; const char Select; FuncPtr SelectFunc; // программа для отображения в самом меню FuncPtr EnterFunc; // программа работы, вызываемая при нажатии Enter в меню const char Text_RUS[20]; const char Text_ENG[20]; } const menuItem; menuItem* selectedMenuItem; // текущий пункт меню menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, NULL_FUNC, NULL_FUNC, {0x00}, {0x00}}; enum { MENU_CANCEL=1, MENU_RESET, MENU_MODE1, MENU_MODE2, MENU_MODE3, MENU_MODE4, MENU_MODE5, MENU_MODE6, MENU_SENS1, MENU_SENS2, MENU_WARM, MENU_PROCESS }; #endif main.c void Language (void){ LCDCLEAR LCD_SetPos(0, 1); if (Mem.EEPROMMap.language_messages != 0) //Если в настройках установлен режим русского языка { printf(" РУС "); } else { printf(" ENG "); } } void menuChange(const menuItem* NewMenu) { if ((void*)NewMenu == (void*)&NULL_ENTRY) return; selectedMenuItem = NewMenu; LCDCLEAR LCD_SetPos(0, 0); //Очистка экрана LCD if (Mem.EEPROMMap.language_messages != 0) //Если в настройках установлен режим русского языка { printf("%s",(char *)NewMenu->Text_RUS); } else { printf("%s",(char *)NewMenu->Text_ENG); } } // NEXT, PREVIOUS PARENT, CHILD MAKE_MENU(m_s1i1, m_s1i2, m_s1i3, NULL_ENTRY, m_s2i1, 0, NULL_FUNC, NULL_FUNC, "Настройки","Settings"); MAKE_MENU(m_s1i2, m_s1i3, m_s1i1, NULL_ENTRY, NULL_ENTRY, 0, NULL_FUNC, NULL_FUNC, "Корекция","Correction"); MAKE_MENU(m_s1i3, m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, 0, NULL_FUNC, NULL_FUNC, "Стереть стек","Erase stack"); // подменю настройки MAKE_MENU(m_s2i1, m_s2i2, NULL_ENTRY, m_s1i1, NULL_ENTRY, MENU_MODE1, Language, Language, "Язык(Language)","Language"); MAKE_MENU(m_s2i2, m_s2i3, m_s2i1, m_s1i1, NULL_ENTRY, MENU_MODE1, NULL_FUNC, NULL_FUNC, "Режим измерения","Measurement mode"); MAKE_MENU(m_s2i3, m_s2i4, m_s2i2, m_s1i1, NULL_ENTRY, MENU_MODE1, NULL_FUNC, NULL_FUNC, "Режим мойки","Washing mode"); MAKE_MENU(m_s2i4, m_s2i5, m_s2i3, m_s1i1, NULL_ENTRY, MENU_MODE1, NULL_FUNC, NULL_FUNC, "Звук","Sound"); MAKE_MENU(m_s2i5, m_s2i6, m_s2i4, m_s1i1, NULL_ENTRY, MENU_MODE1, NULL_FUNC, NULL_FUNC, "Округление","Rounding"); MAKE_MENU(m_s2i6, NULL_ENTRY, m_s2i5, m_s1i1, NULL_ENTRY, MENU_MODE1, NULL_FUNC, NULL_FUNC, "Сервесный режим","Servesny mode"); Изменено 12 мая, 2017 пользователем Alex_Golubev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться