Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Gforth在变量中存储字符串值_String_Variables_Forth_Gforth - Fatal编程技术网

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!