我试图制作一个简单的ncurses程序来显示一个包含消息的框。我遵循这个link并且它工作得很好。我遇到的问题是,如果我将整个代码放在一个函数中并在循环中调用它,初始化就会出错。据我所知,如果我在函数末尾调用了endwin(),那么再次调用initscr()应该不会有任何问题。我是否缺少一个函数来再次调用initscr()
这是代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>

int call()
{
    WINDOW *mainwin, *childwin;
    int ch;

    if ((mainwin = initscr()) == NULL) {
            fprintf(stderr, "Error initialising ncurses.\n");
            exit(EXIT_FAILURE);
    }

    noecho();
    curs_set(FALSE);

    keypad(mainwin, TRUE);

    mvaddstr(childwin, 1, 6, "Warning! Press q to exit");
    mvaddstr(childwin, 2, 15, "{ OK }");
    refresh();
    while( (ch = getch()) != 'q') {
            refresh();
    }

    delwin(mainwin);
    endwin();
    refresh();

    return EXIT_SUCCESS;
}

int main()
{
    int i;

    for (i=0;i<10;i++) {
            call();
    }

    return 0;
}

编辑:我放了头文件。将代码更改为更简单

最佳答案

示例程序不会调用多个initscr。但是,它也不显示#include行(编译所必需的),因此可能不是实际运行的程序。
关于调用initscr(一次或多次)的问题,至少有两种可能:
您正在使用其他一些curse实现(例如,一个Unix实现,例如HPUX)。如X/Open中所述,可移植程序不得多次调用initscr。
TERM变量未设置为可用值。像往常一样,manual page解释了函数的功能,以及它可能失败的原因。

关于c - 在循环中执行initscr()会导致错误初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29643713/

10-16 17:04