完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在网上看到51单片机似乎不建议使用malloc函数,但这段程序也是看了论坛一位大佬写的多级菜单的程序,不知道怎么改
求教怎么才能正确初始化菜单 使用的是stc89c52rc //首先定义一个菜单结构体 typedef struct menu //定义一个菜单 { unsigned char range_from,range_to; //当前显示的项开始及结束序号 unsigned char itemCount; //项目总数 unsigned char selected; //当前选择项 unsigned char *menuItems[17]; //菜单项目 struct menu **subMenus; //子菜单 struct menu *parent; //上级菜单 ,如果是顶级则为null void (**func)(); //选择相应项按确定键后执行的函数 }Menu; Menu MainMenu = { //定义主菜单 0,3,4,0, //默认显示0-3项,总共4项,当前选择第0项 { "测量表 ", // >表示有下级选项 "其他设置 ", "保护设定 ", "查询 >" } }; Menu searchMenu = { //查询菜单 0,3,6,0, { "记帐记录明细 ", "未采集记录数 ", "设备机号 ", "本机IP地址 ", "记录空间大小 ", "软件版本 " } }; Menu *currentMenu; //当前的菜单 //初始化菜单: void initMenu() { MainMenu.subMenus = malloc(sizeof(&MainMenu)*4); MainMenu.subMenus[0] = NULL ;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数 MainMenu.subMenus[1] = NULL; MainMenu.subMenus[2] = NULL; MainMenu.subMenus[3] =&searchMenu;//第四项查询有子菜单 MainMenu.func = malloc(sizeof(&func)*4); MainMenu.func[0] = NULL; MainMenu.func[1] = NULL; MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数 MainMenu.func[3] = NULL; MainMenu.parent = NULL;//表示是顶级菜单 searchMenu.subMenus = malloc(sizeof(&searchMenu)*6); searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL; searchMenu.func = malloc(sizeof(&printf)*6); searchMenu.func[0] = searchMenu.func[1] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL; searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项 currentMenu = &MainMenu; } |
|
相关推荐
1个回答
|
|
可能可以使用静态数组代替动态内存分配,如:
#define MAX_MENU_LEVELS 3 #define MAX_MENU_ITEMS 5 typedef struct { unsigned char range_from, range_to; //当前显示的项开始及结束序号 unsigned char itemCount; //项目总数 unsigned char itemTexts[MAX_MENU_ITEMS][16]; //项目文本 } Menu; Menu menu[MAX_MENU_LEVELS]; //初始化菜单 void initMenu() { //第一级菜单 menu[0].range_from = 0; menu[0].range_to = MAX_MENU_ITEMS-1; menu[0].itemCount = MAX_MENU_ITEMS; strcpy(menu[0].itemTexts[0], "Option 1"); strcpy(menu[0].itemTexts[1], "Option 2"); strcpy(menu[0].itemTexts[2], "Option 3"); strcpy(menu[0].itemTexts[3], "Option 4"); strcpy(menu[0].itemTexts[4], "Option 5"); //第二级菜单 menu[1].range_from = 0; menu[1].range_to = 2; menu[1].itemCount = 3; strcpy(menu[1].itemTexts[0], "Suboption 1"); strcpy(menu[1].itemTexts[1], "Suboption 2"); strcpy(menu[1].itemTexts[2], "Suboption 3"); //第三级菜单 menu[2].range_from = 0; menu[2].range_to = 0; menu[2].itemCount = 1; strcpy(menu[2].itemTexts[0], "Subsuboption 1"); } 然后在程序中就可以直接使用menu数组,不需要用malloc函数分配内存了。同时,也要注意数组的大小,确保不会溢出。 |
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1072浏览 3评论
195浏览 2评论
457浏览 2评论
370浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 01:19 , Processed in 1.052389 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号