如何使用gforth从vars向文件中写入任何内容



我使用了一些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得到正确的值吗?我希望tofd_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

相关内容

最新更新