为什么在Linux控制台模式下无法使用INPUT$和INKEY$?

3
我写了一段QB64代码来尝试BASIC函数$和INKEY$
当程序不在Linux控制台模式下运行时,它能正常运行,但如果我们将SW设置为在Linux控制台模式下运行,该SW将无法正常运行。它会卡住。
我认为问题是由于Linux控制台的行为导致的。你有没有解决方法?
以下是简单的代码:
$CONSOLE:ONLY
_DEST _CONSOLE

PRINT "Hit a key"
A$ = INPUT$(1)
PRINT A$
PRINT "Hit a key"

B$ = ""
WHILE B$ = "": B$ = INKEY$: WEND
PRINT B$

PRINT "Hit a key"

C$ = INPUT$(1)

PRINT C$

1
你最好在更加官方的QB64支持论坛上提出这个问题,也许会得到更好的帮助。 - Jeff Zeitlin
2
@SirJoBlack 这是因为在Linux控制台(或xterm或任何其他终端,终端仿真器等)中未实现INKEY$:当使用INKEY$INPUT$时,QB64甚至不从TTY读取字符序列。 - user539810
2
还有一些额外的QB64键盘函数_KEYCLEAR、_KEYHIT、_KEYDOWN,你可以看一下。 - eoredson
2
@SirJoBlack 可能是因为太少的人知道如何处理终端的低级细节。这是一个适用于ASCII而不是其他任何内容的版本;它精确地读取1个字节并删除127(DEL)以外的字节。您可以通过DECLARE LIBRARY使用它(请参见顶部的注释),但需要比仅调用INKEY$_KEYHIT更多的操作。不要被顶部的长注释吓到。如果您只处理本地机器上的ASCII,则无需担心。希望它对您有用! - user539810
1
QB64维基表示:_DEST _CONSOLE可以使用PRINT或INPUT将信息发送到控制台窗口。 - eoredson
显示剩余5条评论
3个回答

2
从控制台获取信息的方法是存在的。我们可以使用命令INPUT,但这并不允许我们避免按下< enter >键来输入数据。我的问题是关于使用INKEY$INPUT$,它们将允许我们不按下< enter >键。
以下代码在Linux控制台上运行正确,但不是这个问题的解决方案。
最初的回答:您可以使用INKEY$函数以及循环结构来检测按下的键,并将其添加到字符串中,直到用户按下< enter >键。然后,您可以使用INPUT$函数来读取字符串。
$CONSOLE:ONLY
_DEST _CONSOLE

INPUT A
PRINT A

1

这个 keyhit 函数在 Linux 上可能实际起作用:

PRINT "Hit a key:"
DO UNTIL _KEYHIT
    _LIMIT 20
LOOP
PRINT "Key pressed."

或测试一个键:

PRINT "Hit <escape>:"
DO
    _LIMIT 20
    x = _KEYHIT
    IF x = 27 THEN EXIT DO
LOOP
PRINT "Escape pressed."

嗨,我尝试按照您的建议操作。在Linux桌面上,即使作为input$inkey$,它也可以正确运行,但是您指示我的函数在控制台下无法运行,即使将控制台设置为原始模式(stty raw)或非规范模式(stty -icanon)。这与input$inkey$的行为相同。 - Sir Jo Black
我需要一个在控制台模式下运行的程序,即以以下两行开头的程序:$CONSOLE:ONLY_DEST _CONSOLE。这两行代码可以告诉编译器需要生成一个只能以文本模式方式运行的程序,而不是使用 OPEN-GL。 - Sir Jo Black
1
除非你能找到一种打开控制台进行输入/输出的方法,否则我看不出还有其他办法。 - eoredson

0

刚刚运行了这段代码:它在Win10上无法像Linux一样捕获任何键盘活动。

也许控制台模式只能用于输出!?

$CONSOLE
_DEST _CONSOLE
$SCREENHIDE
FOR L = 1 TO 10
   PRINT L;
NEXT
DO
    x = _KEYHIT
    IF x THEN END
LOOP
END

从控制台获取信息的方法是存在的,您可以使用在文本控制台中运行的“INPUT”命令。但是,该命令不允许您按下一个键并在不按回车键的情况下获得结果。 - Sir Jo Black
1
@SirJoBlack 这是因为 INPUTLINE INPUT 从标准输入接收文本,而标准输入从终端接收文本(除非标准输入被重定向)。不幸的是,标准输入和终端本身都以某种方式进行缓冲 正如我在这个答案中所解释的。您可以取消规范模式以禁用终端的 EOF (Ctrl-D) 行为和 EOL 要求,并且您可以直接使用控制终端(在 Linux 上始终为 /dev/tty,据我所知)来绕过整个 stdin 重定向和缓冲问题。 - user539810

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接