ncurses: почему getch не ждет, пока я нажму клавишу?

На справочной странице ncurses(3) linux:

Опция nodelay делает вызов getch неблокирующим. Если ввод не готов, getch возвращает ERR. Если отключено (bf имеет значение FALSE), getch ждет, пока не будет нажата клавиша.

Почему в моем примере getch не ждет, пока я не нажму клавишу?


#!/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();

person sid_com    schedule 20.03.2016    source источник
comment
Кажется, это работает для меня с ncurses 6 и perl6 --version This is Rakudo версии 2016.02, построенной на MoarVM версии 2016.02, реализующей Perl 6.c. Какую версию Perl 6 вы используете?   -  person Coke    schedule 21.03.2016
comment
Coke: perl6 -v: это версия Rakudo 2016.02-151-gb243a96, построенная на MoarVM версии 2016.02-33-g1e3d2ac, реализующая Perl 6.c. и нкурсы 5.   -  person sid_com    schedule 21.03.2016


Ответы (1)


Эквивалент в C работает - что-то странное с вашей конфигурацией. В любом случае у меня нет установки perl6 для отладки.

Единственная странная вещь, которую я вижу в программе, это то, что вы пропустили "()" после initscr, что я ожидал увидеть для согласованности. В C, если вы это сделаете, последующие вызовы будут сбрасывать ядро ​​(поскольку &initscr является допустимым указателем).

person Thomas Dickey    schedule 20.03.2016
comment
Я добавил "()" к initscr, но getch все еще не ждет. - person sid_com; 21.03.2016
comment
В синтаксисе Perl 6 допустимо опускать скобки. Из документов: Аргументы предоставляются в виде списка, разделенного запятыми. Для устранения неоднозначности вложенных вызовов можно использовать круглые скобки или наречную форму. doc.perl6.org/language/functions#Arguments - person donaldh; 24.03.2016