You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:30:23