为什么stdscr变量在PDCurses中不起作用?

时间:2015-11-03 16:35:06

标签: curses pdcurses

当我将stdscr变量传递给任何接收WINDOW*参数的函数(例如keypadwprintw)时,我的PDCurses程序终止。但是当我捕获WINDOW*返回的initscr并使用它时,它会起作用。

我假设一旦initscr被调用,它返回的WINDOW*stdscr变量应该是相同的。但在比较他们的地址后,我意识到事实并非如此。

我可以继续使用WINDOW*返回的initscr,但这在多终端程序中不起作用,其中必须使用newterm返回SCREEN* ,而不是WINDOW*。在这种情况下,我一定需要使用stdscr变量,它仍然拒绝工作。

以下是一个有效的示例代码:

#include <curses.h>

int main()
{
    WINDOW* wnd = initscr();
    wprintw(wnd, "Hello world!");
    refresh();
    endwin();
    return 0;
}

但是这个没有:

...
int main()
{
    initscr();
    wprintw(stdscr, "Hello world!"); // the program terminates here
    refresh();
    endwin();
    return 0;
}

这个潜在的多终端程序也不起作用:

...
int main()
{
    SCREEN* term = newterm(NULL, stdout, stdin);
    set_term(term);
    wprintw(stdscr, "Hello world!"); // the program terminates here
    refresh();
    endwin();
    return 0;
}

所以我不知道stdscr变量发生了什么。我使用的是Windows 8.1 x64,Visual Studio 2012的VC ++ x64和PDCurses 3.4.0.3(使用Nuget包管理器下载)。

2 个答案:

答案 0 :(得分:1)

因此,引用Git问题#31:https://github.com/wmcbrine/PDCurses/issues/31

看起来你可能在没有定义PDC_BUILD_DLL的情况下进行构建。如win32 / README(后来的win32 / README.md,wincon / README.md)中所述:

“当您将库构建为Windows DLL时,必须始终定义   PDCURSES_DLL_BUILD链接时。 (或者,如果你只想   使用DLL,您可以将此定义添加到curses.h。)“

所描述的修改是对与我在SourceForge上分配的DLL捆绑在一起的curses.h文件,而不是来自NuGet项目的那些文件,也不是该软件包中包含的相关文档。

答案 1 :(得分:0)

PDCurses实现initscr()的最后一行(真Xinitscr(),由initscr()调用,但无论如何)只是return stdscr;。因此,stdscrinitscr()的返回值之间绝对没有区别。

我不知道你做错了什么,但我无法重现你的示例程序的任何问题。您可能希望更多地指定您的环境 - 操作系统,编译器,PDCurses版本 - 以及您将其解释为崩溃的确切内容。顺便说一句,这里包含stdio.h是不必要的(但无害)。

无论如何,PDCurses不支持多个同时终端。