2014-03-12 37 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的右邊都有爭論堆棧和按預期工作。