当我将stdscr
变量传递给任何接收WINDOW*
参数的函数(例如keypad
和wprintw
)时,我的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包管理器下载)。
答案 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;
。因此,stdscr
与initscr()
的返回值之间绝对没有区别。
我不知道你做错了什么,但我无法重现你的示例程序的任何问题。您可能希望更多地指定您的环境 - 操作系统,编译器,PDCurses版本 - 以及您将其解释为崩溃的确切内容。顺便说一句,这里包含stdio.h是不必要的(但无害)。
无论如何,PDCurses不支持多个同时终端。