2013-02-02 87 views
1

因此,对于任何曾经使用过FORTH的人来说,这应该是一个简单的问题,但我是一位试图学习如何编写此语言的新手(而且这与C++有很大不同)。接受用户输入的变量

无论如何,我只是试图在FORTH中创建一个名为“高度”的变量,并且我希望用户能够在某个单词“setHeight”被调用时为“高度”输入一个值。然而,我尝试的所有东西似乎都失败了,因为我不知道如何设置变量,也不知道如何获取用户输入并将其放入变量中。

VARIABLE Height 5 ALLOT 
    : setHeight 5 ACCEPT ATOI CR ; 

我希望这是一个容易解决的问题,任何帮助将不胜感激。 预先感谢您。

回答

2

看看Rosettacode输入/输出的例子为string or number input in FORTH

字符串输入

: INPUT$ (n -- addr n) 
    PAD SWAP ACCEPT 
    PAD SWAP ; 

号码输入

: INPUT# (-- u true | false) 
    0. 16 INPUT$ DUP >R 
    >NUMBER NIP NIP 
    R> <> DUP 0= IF NIP THEN ; 
0

大点要记住你的自我-edification - C++是严重的typecasted,福斯是co完全相反。您希望Height是一个字符串,一个整数还是一个浮点数,并且它是带符号还是无符号?每个都有自己的用例。无论您选择什么,您都必须根据您选择的类型与Height变量进行交互。想想每次你的意思。

根据您的ATOI调用来判断,我假设您希望Height的值为整数。但是,一个5字节的整数是不寻常的,所以我仍然不确定。但这里假设:

VARIABLE Height 1 CELLS ALLOT 
VARIABLE StrBuffer 7 ALLOT 

: setHeight (--) 
    StrBuffer 8 ACCEPT 
    DECIMAL ATOI Height ! ; 

CELLS调用确保您创建的变量具有您的CPU偏好的位数。 DECIMAL调用可以确保你在ATOI之前并没有改变成HEX。

创建StrBuffer变量是获取字符串暂存空间的多种方法之一。假设您的CELL为16位,则对于零终止的16位有符号整数,最多需要7个字符 - 例如“-32767 \ 0”。一些实现具有PAD,可以使用它来代替创建自己的缓冲区。另一个常见词是SCRATCH,但我不认为它按照我们想要的方式工作。

如果你坚持创建自己的字符串缓冲空间,这是我个人非常喜欢,因为你知道你到底有多少空间了,再考虑为所有人创造你的话的字符串处理需要一个大的缓冲区。例如:

VARIABLE StrBuffer 201 ALLOT 

这也使您不必使16位单元的假设,因为200个字符,可轻松容纳64位有符号整数,如果这就是现在你的执行的单元尺寸或某一天下来路。

+0

由于PAD是在CORE wordset一个标准的话,所有标准的Forth是_required_有PAD。由于PAD只是用作这种临时缓冲区,所以我没有看到为此创建自己的缓冲区。 –

+0

@MichaelMorris在设计为以编译应用程序运行的嵌入式应用程序中,PAD可能存在,但可能无法正常工作。例如,编译的字典在设备交付时很难写入闪存,并且永远不会为用户提供交互性。PAD通常通过使用字典顶部来实现,但如果不支持写入Flash,则写入PAD将失败。此外,FWIW,它是CORE EXT词汇组的一部分,而不是CORE。 – CivFan