Gforth将字符串值存储在变量中

时间:2014-03-14 17:16:19

标签: string variables forth gforth

我正在尝试将字符串值存储到变量中。要定义变量,我使用:

: define CREATE 0 , ;
define x

我可以使用

轻松地将整数/浮点值存储到x
10 x !

10.0e x f!

要访问它,我使用@f@。现在我正在尝试存储一个字符串值:

s" hello world" x !

这个问题是它将两个值推送到堆栈(因为它是一个计数字符串),但x !只会将项目存储在顶部,这是字符串的长度。这是危险的,因为堆栈内容可能在引用x时被修改,使得地址不直接低于长度(坏!),因此type将失败。所以我的问题是,有没有办法将值(地址和长度)存储到x?或者是否有一个不同的数据类型/操作数可以让我实现这个目标?

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

你需要做的很多事情都非常类似于你已经完成的事情。

如果您想在使用它创建的内容中存储两个值,则需要不同版本的define;

: 2define create 0 , 0 , ;

在一个单词的开头加上两个是一个约定,它表示它与没有这两个单词的单词做同样的事情,而是在双单元格的东西上做。

要使用它,你会写:

2define 2x
//Write something to 2x
s" Hello world!" 2x 2!
//Retrieve it and print
2x 2@ type

值得注意的是s"返回的地址不能保证在程序的持续时间内持续,并且可能会被稍后使用的s"覆盖,以查看制作字符串的方法保证持续查看此答案https://stackoverflow.com/a/8748192/547299的变量(它有点长,但有一个名为string的单词的定义,这可能是说明性的。)

答案 1 :(得分:1)

不要卡在“!”上。这更有效......

: 2x S" Hello World!" ;

另外,定义对浮点数不安全,可能是

   : define CREATE 0 f, does> f@ ;
 \   3.1459e0 define pi
 \   pi f. 3.1459 ok

答案 2 :(得分:1)

Gforth正是为此目的准备了一个$! ( c-addr u addr -- )字。 给定一个字符串和一个地址,它会将字符串复制到一个新的字符串中 ALLOCATEd空格并将字符串存储在地址中。如果是地址 已经存储了一个字符串,该字符串将被释放。

所以:

define x
s" hello world" x $!

x $@ type  \ hello world

你也可以使用带有计数字符串和单词的固定缓冲区 PLACE和+ PLACE,具有$!相同的堆栈图片。等价 以上(虽然有字符限制):

256 buffer: x
s" hello world" x place

x count type  \ hello world

s" !" x +place
x count type  \ hello world!