2017-07-10 10 views
4

なぜdelwinは2番目のinitscrに何も返さないのですか? endwinは、initscrを呼び出す前の状態にリセットされると思いました。実際に何が起こっているdelwin()がundefを返した後にinitscr()がなぜなるのですか?

use NCurses; 

my $win = initscr(); 
addstr('AAA'); 
nc_refresh(); 
sleep 2; 
delwin($win); 
endwin(); 

... 

my $new_win = initscr(); 
if ! $new_win.defined { 
    endwin(); 
    dd $new_win;   # NCurses::WINDOW $new_win = NCurses::WINDOW 
    die "win undefined"; # win undefined 
} 
addstr('BBB'); 
nc_refresh(); 
sleep 2; 
delwin($new_win); 
endwin; 
+0

「dd $ new_win」とは何ですか?おそらく '失敗 'が返されたでしょうか? –

+0

私はこの例を更新しました。 –

+0

'endwin'は、cursesインターフェースを一時停止(より良い言葉がないため)し、リソースを解放しません。 –

答えて

4

initscr戻りstdscr(標準のウィンドウ)ということです。そのNULLポインタを戻しますdelwinはそれを削除(ポインタが正当に更新さSCREEN構造の一部である)ので、initscrの後続の呼び出しは、(新しい画面newtermを作成したではありません)。原則として、アプリケーションは、初期化時に作成された2つの他のウィンドウを参照する可能性がありますが、アプリケーションはこれらを無視する可能性があります(curscrnewscr)。

ただし、ドキュメントを読むことをお勧めします。

違い

のX/Openは、ポータブルアプリケーションが何度もinitscrより を呼び出してはならないことを指定します:

  • ポータブルinitscrマニュアルページのDifferences部分を引用使用する方法initscrは一度オンですendwinの後に画面を復元するには、refresh( curs_refresh(3x)を参照)を使用してください。

  • この実装は、endwininitscrを使用できます。エラーがなく出るよりも、検出されたときに呪いの

古いバージョン、例えば、BSD 4.4は、initscrからヌルポインタ に戻ってきてもよいです。 XSI Cursesの戻り値をinitscrにチェックすると安全ですが冗長です。

関連する問題