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

How to write anything to files from vars with gforth?

我使用了一些 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:

我指的是 official documentation 但我找不到任何地方我应该做什么才能根据我设置的变量(可以是文本和数字(两者))获得正确的内存地址。

弗朗索瓦

s" .test" r/w open-file throw fd-out 中 fd-out 是否得到正确的值?我希望在 fd_out 之前有一个 to,假设 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-Index

所以 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 #> ;

结果( c-addr u )位于transient buffer

使用这个辅助词,您的测试可以改写如下:

: 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 has $tmp ( xt -- c-addr u ) 将输出重定向到临时字符串的单词。所以你可以做

  [: testvar @ . ;] $tmp fd-out write-line throw