【问题标题】:doing initscr() in a loop causes error initialisation在循环中执行 initscr() 会导致错误初始化
【发布时间】:2015-04-15 07:07:32
【问题描述】:

我正在尝试制作一个简单的 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;
}

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

【问题讨论】:

  • 可以在这里分享错误信息吗?
  • @niyasc 它只是打印我在代码中编写的错误。初始化 ncurses 时出错

标签: c ncurses curses


【解决方案1】:

示例程序不会多次调用initscr。但是,它也没有显示#include 行(编译所必需的),所以它可能不是实际运行的程序。

关于调用initscr(一次或多次)的问题,至少有两种可能:

  • 您正在使用一些其他的curses 实现(例如,一个Unix 的,如HPUX)。正如X/Open 中所述,可移植程序不得多次调用 initscr
  • TERM 变量未设置为可用值。像往常一样,manual page 解释了该函数的作用,以及它可能失败的原因。

【讨论】:

  • intscr 在一个函数中,我反复调用该函数。这不意味着 initscr 被多次调用吗?无论如何,您指出的事情确实帮助我解决了这个问题。非常感谢!
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2018-12-29
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多