set_menu_format row 或 col 参数是否有硬性限制?函数是菜单头文件的一部分

问题描述 投票:0回答:1

我正在尝试用 C 语言编写一个基于菜单的 ncurses 程序。我已经确保 set_menu_format 行参数小于我的 sub_window 大小。但是,我无法在 rows 参数中传递大于 21 的数字。

我有一个菜单遍历功能,可以选择菜单项。代码如下

void traverse(MENU *my_menu,WINDOW **my_menu_win,ITEM **my_items,int argc) {
    int c,cur_win_index=0;
    while((c=getch()) != 'q') {
        ITEM *cur_item = current_item(my_menu);
        switch(c) {
            case 'j':
                if(cur_item == my_items[argc-2])
                    menu_driver(my_menu, REQ_FIRST_ITEM);
                else
                    menu_driver(my_menu, REQ_DOWN_ITEM);
                break;

            case 'k':
                if(cur_item == my_items[0])
                    menu_driver(my_menu, REQ_LAST_ITEM);
                else
                    menu_driver(my_menu, REQ_UP_ITEM);
                break;
        }
        wrefresh(my_menu_win[0]);
    }
}

在另一个显示菜单的程序中调用上述函数。 完整的程序代码如下

void menu_display(int argc, char *argv[]) {
    // Declaration //
    ITEM **my_items;
    MENU *my_menu;
    WINDOW *my_menu_win[3], *title_win;
    PANEL *my_panels[3];
    
    char store[argc-1][4];
    int c,i;
    char search;
    int nlines,ncols,startx,starty;
    // Declaration //

    // Initialize curses //
    initscr();
    start_color();
    cbreak();
    noecho();
    curs_set(0);
    keypad(stdscr,TRUE);
    init_pair(1, COLOR_RED, COLOR_BLACK);
    // Initialize curses //

    // Initialize Variables //
    getmaxyx(stdscr, nlines, ncols);
    starty = 0;
    startx = 0;
    // Initialize Variables //


    // Create Menu Items //
    my_items = (ITEM **)calloc(argc, sizeof(ITEM *));
   
    for(i=1;i<argc;i++)  {
        sprintf(store[i-1],"%d",i);
        my_items[i-1] = new_item(store[i-1], argv[i]);
    }
    my_items[argc] = (ITEM *)NULL;
    // Create Menu Items //

    
    // Create Menu //
    my_menu = new_menu((ITEM**)my_items);
    // Create Menu //
   

    // Create windows and panels //
    title_win = newwin(2, ncols, starty, startx);

    my_menu_win[0] = newwin(30,ncols/3,starty+3,startx);
    my_menu_win[1] = newwin(30,ncols/3,starty+3,startx+(ncols/3));
    my_menu_win[2] = newwin(30,ncols/3,starty+3,3*startx+(2*ncols/3));
   
    for(i=0;i<3;i++)
        my_panels[i] = new_panel(my_menu_win[i]);
    // Create windows and panels //


    // sets menu main and sub windows ; sets menu mark//
    set_menu_win(my_menu, my_menu_win[0]);
    set_menu_sub(my_menu, derwin(my_menu_win[0],29,(ncols/3)-2,1,1));
    set_menu_format(my_menu, 21, 1);

    set_menu_mark(my_menu, "*"); // mark strings to show selected items
    // sets menu main and sub windows ; sets menu mark//
     
  
    // Print border around main window; add title//
    print_title(title_win, 1, startx, ncols, "File Manager", COLOR_PAIR(1));
    mvwprintw(title_win, 0, 0, "%d %d", nlines, ncols);
    
    for(i=0;i<3;i++)
        box(my_menu_win[i], 0, 0);
    // Print border around main window and title //
   
    
    // Refresh title window//
    wrefresh(title_win);
    // Refresh title window//


    // Post the menu; refresh panels //
    post_menu(my_menu);
    update_panels();
    doupdate();
    // Post the menu; refresh panels //

    
    // Traverse Menu Items //
    traverse(my_menu, my_menu_win, my_items, argc); 
    // Traverse Menu Items //
   
    
    // Free memory //
    unpost_menu(my_menu);
    free_menu(my_menu);
    for(i=0;i<argc;i++)
        free_item(my_items[i]);

    endwin();
    // Free memory //

}

这是我遇到问题的菜单显示代码部分。

set_menu_win(my_menu, my_menu_win[0]);
set_menu_sub(my_menu, derwin(my_menu_win[0],29,(ncols/3)-2,1,1));
set_menu_format(my_menu, 21, 1);

如果 set_menu_format 的行参数 <= 21 then the program works.
然而通过 getmaxyx 获得的最大行数是 35。
如果我增加传递给 set_menu_format 的大小,它会返回错误 free():无效指针 zsh:IOT指令(核心转储)

传递给 set_menu_format 的 rows 参数是否有限制?

c menu ncurses curses
1个回答
0
投票

经过一番实验,行的大小似乎有一定的限制,这是由电脑屏幕尺寸决定的

© www.soinside.com 2019 - 2024. All rights reserved.