String Gforth在变量中存储字符串值
我试图将字符串值存储到变量中。要定义变量,我使用:String Gforth在变量中存储字符串值,string,variables,forth,gforth,String,Variables,Forth,Gforth,我试图将字符串值存储到变量中。要定义变量,我使用: : define CREATE 0 , ; define x 我可以使用 10 x ! 或 要访问它,我可以使用@或f@。现在我尝试存储一个字符串值: s" hello world" x ! 问题是它将两个值推送到堆栈中(因为它是一个计数字符串),但是x将仅将项目存储在顶部,即字符串的长度。这是很危险的,因为在引用x时,堆栈内容可能已被修改,因此地址不直接低于长度(错误!),因此类型将失败。所以我的问题是,有没有办法将两个值(地址和长度)
: define CREATE 0 , ;
define x
我可以使用
10 x !
或
要访问它,我可以使用@
或f@
。现在我尝试存储一个字符串值:
s" hello world" x !
问题是它将两个值推送到堆栈中(因为它是一个计数字符串),但是x
将仅将项目存储在顶部,即字符串的长度。这是很危险的,因为在引用x
时,堆栈内容可能已被修改,因此地址不直接低于长度(错误!),因此类型
将失败。所以我的问题是,有没有办法将两个值(地址和长度)都存储到x
?或者是否有其他数据类型/操作数可以让我实现这一点
感谢您的帮助 要使这项工作顺利进行,您需要的很多东西都与您已经拥有的东西非常相似 如果要在用它创建的东西中存储两个值,则需要不同版本的
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“
覆盖,以查看一种生成保证持续时间的字符串变量的方法。请查看此答案(这有点冗长,但是有一个叫做string
的词的定义,这可能是说明性的)。不要被“!”卡住。这更有效
: 2x S" Hello World!" ;
此外,define对于float是不安全的,它可能是
: define CREATE 0 f, does> f@ ;
\ 3.1459e0 define pi
\ pi f. 3.1459 ok
Gforth有一个$!(c-addr u addr--)
单词正是为了这个目的。
给定一个字符串和地址,它将该字符串复制到
分配的空间并将字符串存储在地址处。如果
已经存储了一个字符串,该字符串将被释放
因此:
您还可以使用带有计数字符串和单词的固定缓冲区,如
PLACE和+PLACE,它们具有相同的堆栈图片。$!
。等价
如上所述(尽管有字符限制):
我不认为这是在变量中定义字符串,而是创建一个在堆栈上放置相同内存地址和大小的字。
: define CREATE 0 f, does> f@ ;
\ 3.1459e0 define pi
\ pi f. 3.1459 ok
define x
s" hello world" x $!
x $@ type \ hello world
256 buffer: x
s" hello world" x place
x count type \ hello world
s" !" x +place
x count type \ hello world!