2015-11-03 29 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

相關問題