2014-03-12 33 views
2

Rosetta code开始,我使用以下方法连接Forth中的字符串。使用Gforth在多个字符串连接上堆栈下溢

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 

无法从我的基本第四曝光,我看到代码将在堆栈上三根弦,然后附加在堆栈与它下面的字符串的顶部的字符串,然后追加在堆栈上的新字符串与底部的一个。

为什么这段代码在最后一个地方下溢?有没有解决的办法?

+0

与我的回答无关,“地点”似乎没有记录在Gforth手册中,但绝对定义了这似乎有点奇怪。 – sheepez

回答

2

您的第二段将“hi”复制到内存位置pad,然后将“hello”复制到相同的位置(覆盖“hi”)。

因此,当您尝试第一个+place时,它会从堆栈中为“世界”引用addr u,然后将“世界”添加到“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 

在此代码“你好”不会覆盖“喜”,转而追加到它,所以接下来+place的右边都有争论堆栈和按预期工作。