使用Gforth对多个字符串连接进行堆栈下溢



在Rosetta代码中,我使用以下方法在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暴露中,我看到代码将三个字符串放在堆栈上,然后将字符串添加到堆栈顶部与它下面的字符串,然后将新字符串再次添加到堆栈上与底部的字符串。

为什么这段代码在最后一个+位上有下溢?有办法解决这个问题吗?

第二个代码段将"hi "复制到内存位置pad,然后将"hello "复制到相同的位置(覆盖"hi ")。

因此,当您尝试第一个+place时,它从堆栈中获取addr u对"world"的引用,然后将"world"附加到"hello"。所以如果你尝试

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

在这段代码中,"hello"没有覆盖"hi",而是附加在"hi"后面,所以下一个+place在堆栈上有正确的参数,并按预期工作。

相关内容

  • 没有找到相关文章

最新更新