ncurses中new_menu()非1奇数项崩溃及菜单描述异常问题
NCurses菜单开发问题
已解决:奇数项菜单崩溃问题
- 触发场景:动态生成菜单时,当菜单包含3、5等非1的奇数个有效项目,程序崩溃
- GDB报错信息:
_nc_Connect_Items error ncurses _nc_Connect_Items (menu=menu@entry=0x5555555f2830, items=items@entry=0x5555555e0b70) at ../menu/m_global.c:185 - 解决方式:在
my_items数组的末尾添加空指针标记:my_items[tot] = (ITEM*) NULL;,满足ncurses要求的菜单项目数组必须以NULL结尾的规则。
未解决:菜单描述字符串全部重复为最后一项
所有菜单项目的描述字段都显示最后一项的描述值,查阅ncurses相关教程文档未找到对应说明,需要排查原因。
相关代码片段
... WINDOW *my_wins[1]; ITEM **my_items; MENU *my_menu; WINDOW *my_menu_win; int n_choices = 0; int c; /* Initialize curses */ setlocale(LC_CTYPE, "uk_UK.UTF-8"); initscr(); clear(); refresh(); start_color(); cbreak(); noecho(); keypad(stdscr, TRUE); /* Initialize all the colors */ init_pair(1, COLOR_RED, COLOR_BLACK); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_BLUE, COLOR_BLACK); init_pair(4, COLOR_CYAN, COLOR_BLACK); init_pair(5, COLOR_WHITE, COLOR_BLACK); init_pair(6, COLOR_YELLOW, COLOR_BLACK); init_pair(7, COLOR_BLACK, COLOR_WHITE); init_pair(8, COLOR_MAGENTA, COLOR_BLACK); //To print something when you have no consumables for (int i = 0; i < CONSUMABLESMAX +1; i++) { Consumable * c = &consumablesBag[i]; int q = c->qty; if (q > 0) { n_choices++; } } if (n_choices == 0) { my_menu_win = newwin(10, 40, 2, 2); box(my_menu_win, 0, 0); wattron(my_menu_win,COLOR_PAIR(6)); mvwprintw(my_menu_win,2, 2, "Your bag is empty."); mvwprintw(my_menu_win,3, 2, "You'll find more consumables soon."); wattroff(my_menu_win,COLOR_PAIR(6)); wrefresh(my_menu_win); refresh(); screenTime(3); endwin(); return; } /* Create menu items */ int tot = 0; int q = 0; my_items = (ITEM **)calloc(n_choices,sizeof(ITEM *)); for (int i = 0; i < CONSUMABLESMAX +1; i++) { if (tot < n_choices) { Consumable * c = &consumablesBag[i]; q = c->qty; if ( q > 0) { char qty[15]; sprintf(qty, "x%i", q); my_items[tot] = new_item(consumablestrings[i], qty);//consumablestrings[i]); tot++; } } else { break; } } /* Create menu */ my_menu = new_menu((ITEM **)my_items); /* Set description off */ //menu_opts_off(my_menu,O_SHOWDESC);
补充说明
调试数组索引逻辑正常,菜单在2、4个项目时可正常运行。经提示查看文档后添加空指针解决了崩溃问题,但描述重复问题仍未解决,需进一步帮助。
内容的提问来源于stack exchange,提问作者jggrnub
相关产品推荐
相关产品推荐

