2012-09-30 1 views
6

私はこれを読もうとしてきましたが、私はそれについて言及を見つけることができません。ForthのS "..."の生涯は何ですか?

標準によると、S"で作成された文字列を変更することはできません、とGforthで簡単な実験から、それは文字列のためのスペースが辞書やパッドの地域から来ていないことは明らかです:

hex 
here . 7F48AB3B8758 ok 
pad . 7F48AB3B8808 ok 
s" test" .s <2> 77FDD0 4 ok 

そのアドレスはどれくらいの期間有効であると思いますか?

つまり、このアドレス(およびカウント)を変数に格納すると、後でプログラムで参照することはできますか、それを辞書またはヒープの別の場所に移動する必要がありますか?私が住所を保管しないと、記憶が漏れてしまいますか?

答えて

7

定義にコンパイルすると、文字列の有効期間は定義の有効期間になります。 s"は、通常、コンパイル時にのみ使用されます。

すべては、解釈時にs"の使用を許可するわけではなく、実際にはANSは「この単語の解釈セマンティクスは未定義です」と述べています。この行動は、少なくともあなたの特定のForthに特有のものです。

Gforthを使用しているように見えますが、少なくとも1つの解釈時文字列には予約領域があります。 Gforthのマニュアルには、 "...文字列は次の呼び出しがあるまでs"までしか存在しません"と記載されています。 「一部のForthシステムでは、複数の文字列が保持されていますが、通常はまだ有効期間が限られています。 (Section 3.24 Characters and Strings)。

私はそれが助けてくれることを願っています!

+0

ありがとうございました!私は明らかにそれらの段落を逃した。少なくともそれはそれを明らかにする。 – harald

+1

あなたは正しいですが、gForthでは "少なくとも1つの解釈時の文字列"は実際にあなたが望む数を意味します。 gForthでは、 'S ''は解釈時にメモリを割り当て、そこに文字列をコピーし、決して解放しません(解釈するためには大丈夫です)。 –

関連する問題