2015-11-03 32 views
1

当我将stdscr变量传递给接收到WINDOW*参数的任何函数(例如,keypadwprintw)时,我的PDCurses程序终止。但是,当我捕获由initscr返回的WINDOW*并使用它时,它就可以工作。为什么stdscr变量在PDCurses中不起作用?

我假设一旦调用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和使用Nuget包管理器下载的PDCurses 3.4.0.3。

+0

一个简短的示例程序会有所帮助(PDCurses不会从'initscr'返回'stdscr';也许你已经声明了一个冲突的变量)。 –

+0

谢谢。我添加了示例代码。是的,我提到我可以使用'initscr'返回的'stdscr',但我需要知道为什么'stdscr'变量不适合我。 – eXe

回答

0

PDCurses的最后一行initscr()(实际上是Xinitscr(),它被initscr()调用,但无论如何)只是return stdscr;。所以stdscr与返回值initscr()之间绝对没有区别。

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

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

+0

是的,应该没有区别,但它在我身边失败了。我使用Windows 8.1 x64,VC++ v18.00.31101 for x64(来自Visual Studio 2012),PDCurses v3.4.0.3(用Nuget包管理器下载)。通过崩溃我的意思是程序意外终止,错误。 是的,'stdio.h'不需要;我正在为使用C++编译的printf进行一些测试,并忘记删除它,对不起。 那么,关于PDCurses中多个终端的支持,'newterm'函数在我身边完美地工作。 – eXe

相关问题