从Rosetta code开始,我使用以下内容作为在Forth中连接字符串的方法。
s" hello" pad place
pad count type
s" there!" pad +place
pad count type
使用此代码,我希望能够将多个字符串连接在一起。但是,以下Gforth失败
s" hi " pad place
s" hello " pad place
s" world" pad
+place
pad +place
pad count type
从我的基本Forth曝光,我看到代码将三个字符串放在堆栈上,然后将字符串附加到堆栈顶部,并在其下面添加字符串,然后将新字符串再次添加到堆栈中。
为什么此代码会在最后+位置下溢?有办法解决这个问题吗?
答案 0 :(得分:2)
您的第二个代码段副本" hi"到内存位置pad
,然后复制"你好"到同一地点(覆盖"嗨")。
因此,当您尝试第一个+place
时,需要addr u
参考" world"从堆栈中然后追加" world"到"你好"。所以如果你试试
s" hi " pad place
s" hello " pad place
s" world" pad +place
//Display the string at pad
pad count type
您应该看到hello world ok
此时,您的所有place
或+place
字都已用完堆栈上的所有字符串引用。如果您只是运行
s" hi " pad place
s" hello " pad place
s" world" pad
+place
//Check the stack
.s
你会看到一个空的堆栈。
现在,当您再次使用pad
时,它会将pad
表示的地址推送到堆栈。所以下一个+place
在堆栈上没有字符串引用供它复制,所以它失败了。
要解决这个问题,你需要这样的东西
s" hi " pad place
s" hello " pad +place
s" world" pad +place
pad count type
在这段代码中,"你好"不会覆盖" hi"而是附加到它,所以下一个+place
在堆栈上有正确的参数,并按预期工作。