1

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

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

我可以继续使用WINDOW*返回的 by ,但这在一个必须使用返回 a而不是 ainitscr的多终端程序中不起作用。在那种情况下,我必然需要使用仍然拒绝工作的变量。newtermSCREEN*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 包管理器下载)。

4

2 回答 2

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 项目的那些文件,而且该包中显然也不包含相关文档。

于 2018-04-26T22:12:46.570 回答
0

PDCurses 实现的最后一行initscr()(really Xinitscr(),由 调用initscr(),但无论如何) 是简单的return stdscr;. stdscr所以和 的返回值绝对没有区别initscr()

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

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

于 2015-11-04T08:02:48.697 回答