2014-03-12 2 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

제 대답과 관련이 없지만'place'는 Gforth 매뉴얼에 문서화되어있는 것처럼 보이지 않지만 조금 이상하게 보입니다. – sheepez

답변

2

두 번째 발췌 문장은 "hi"를 메모리 위치 pad에 복사 한 다음 "hello"를 같은 위치에 복사합니다 ("hi"를 덮어 씁니다).

첫 번째 +place을 시도하면 스택에서 "world"에 대한 참조가 addr u 걸리고 "hello"에 "world"가 추가됩니다. 당신이

s" hi " pad place 
s" hello " pad place 
s" world" pad +place 

//Display the string at pad 
pad count type 

을 시도하는 경우 그래서 당신은 당신의 place 또는 +place 모든 단어가 스택에 문자열 참조 모두를 사용하고이 시점에서 hello world ok

을 볼 수 있습니다. 확인한 후 방금 실행하면

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이의 오른쪽 인수가 그래서 대신에 추가됩니다 스택 및 예상대로 작동합니다.

관련 문제