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

时间:2014-03-12 18:42:53

标签: string algorithm forth gforth stackunderflow

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曝光,我看到代码将三个字符串放在堆栈上,然后将字符串附加到堆栈顶部,并在其下面添加字符串,然后将新字符串再次添加到堆栈中。

为什么此代码会在最后+位置下溢?有办法解决这个问题吗?

1 个答案:

答案 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在堆栈上有正确的参数,并按预期工作。