2016-03-20 3 views
3

(3)Linuxのmanページ:ncurses:キーを押すまで、getchはなぜ待たないのですか? ncursesベースから

NODELAYオプションは、getchは、非閉塞コールされます。入力が準備完了でない場合、getchはERRを返します。無効にすると(bfがFALSE)、getchはキーが押されるのを待ちます。

キーが押されるまで、私の例でgetchが待たないのはなぜですか? Cで


#!/usr/bin/env perl6 
use v6; 
use NativeCall; 

constant LIB = 'libncursesw.so.5'; 
constant ERR = -1; 
class WINDOW is repr('CPointer') { } 

sub initscr()       returns WINDOW is native(LIB) {*}; 
sub cbreak()       returns int32 is native(LIB) {*}; 
sub nodelay(WINDOW, bool)    returns int32 is native(LIB) {*}; 
sub getch()       returns int32 is native(LIB) {*}; 
sub mvaddstr(int32,int32,str)   returns int32 is native(LIB) {*}; 
sub nc_refresh() is symbol('refresh') returns int32 is native(LIB) {*}; 
sub endwin()       returns int32 is native(LIB) {*}; 

my $win = initscr(); # added "()" 
cbreak(); 
nodelay($win, False); 

my $c = 0; 
loop { 
    my $key = getch(); # getch() doesn't wait 
    $c++; 
    mvaddstr(2, 0, "$c"); 
    nc_refresh(); 
    next if $key == ERR; 
    last if $key.chr eq 'q'; 
} 

endwin(); 
+0

これはncurses 6とperl6 --versionの "Perl 6.c.を実装するMoarVMバージョン2016.で構築されたRakudoバージョン2016.02です。 Perl 6のどのバージョンを実行していますか? – Coke

+0

コークス:perl6 -v: "これは、Perl 6.c.を実装するMoarVMバージョン2016.02-33-g1e3d2ac で構築されたRakudoバージョン2016.02-151-gb243a96です。 –

答えて

2

同等の作品 - あなたの構成で奇妙な何かを。いずれにせよ、デバッグするためのperl6セットアップはありません。

私がプログラムで見る唯一の奇妙なことは、initscrの後に"()"を省略したことです。これは、一貫性のために見えると思います。 Cでは、これを行うと、その後の呼び出しはコアをダンプします(&initscrは有効なポインタなので)。

+0

'' initscr'に ''() ''を追加しましたが、 'getch'はまだ待ちません。 –

+0

これは括弧を省略するために有効なPerl 6の構文です。ドキュメントから: "引数はカンマで区切られたリストとして提供されます。ネストされた呼び出しを混乱させるために、カッコまたは副形式を使用できます。" https://doc.perl6.org/language/functions#Arguments – donaldh

関連する問題