我使用了一些gforth代码&我现在想注册结果
当我尝试时:
0 value output
some other code
50 testvar !
: test
s" .test" r/w open-file throw fd-out
testvar @ fd-out write-line throw
fd-out write-file throw
fd-out close-file throw
;
我收到一个内存地址错误
fd-out write-file
:119: Invalid memory address
fd-out >>>write-file<<<
Backtrace:
我参考了官方文档,但我找不到我应该做什么来获得正确的内存地址,这取决于我设置的变量(可以是文本和数字(两者都有((。
弗朗索瓦,
在s" .test" r/w open-file throw fd-out
中,fd out得到正确的值吗?我希望to
在fd_out
之前,假设fd_out
是用Value定义的。
write-line
需要一个字符串(write-line ( c-addr u fileid -- ior )
文件:常规文件(,请参阅https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Word-Index.html#Word-索引
因此,s" 50"
将适用于write-line
,而不是不完整的testvar @
,因为堆栈上还需要一个字符串地址。
write-file
还需要一个字符串(write-file ( c-addr u1 fileid – ior )
文件:常规文件(,而不仅仅是fd_out
。
有了这些变化,它应该会起作用,祝你好运!
WRITE-LINE
获取一个文件句柄和一个字符串,并将该字符串写入文件中。字符串只是一个由地址和长度标识的缓冲区。
要用文本表示法写一个数字,我们需要将这个数字从二进制转换成文本形式
该标准仅为此提供了低级词汇。库可以提供像u-to-s
这样的单词来将无符号数字转换为文本。
: u-to-s ( u -- c-addr u ) 0 <# #s #> ;
结果CCD_ 15位于瞬态缓冲器中。
使用这个辅助词,你的测试可以改写为:
: test
".test" r/w open-file throw to fd-out
testvar @ u-to-s fd-out write-line throw
"test passed" fd-out write-file throw
fd-out close-file throw
;
Gforth有一个$tmp ( xt -- c-addr u )
字,它将输出重定向到一个临时字符串中。所以你可以做
[: testvar @ . ;] $tmp fd-out write-line throw