2

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

我参考了官方文档,但我发现根据我设置的变量(可以是文本和数字(两者)),我应该怎么做才能拥有正确的内存地址。

4

2 回答 2

2

弗朗索瓦,

fd s" .test" r/w open-file throw fd-out-out 是否得到正确的值?我期望一个tobefore 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-Index

因此,它s" 50"适用于write-linetestvar @完整的情况,因为堆栈上还需要一个字符串地址。

write-file还需要一个字符串(write-file ( c-addr u1 fileid – ior )文件:通用文件),而不仅仅是fd_out.

通过这些更改,它应该可以工作,祝你好运!

于 2020-09-18T08:35:16.597 回答
1

WRITE-LINE获取文件句柄和字符串,并将字符串写入文件。字符串只是由地址和长度标识的缓冲区。

要以文本表示形式写入数字,我们需要将此数字从二进制转换为文本形式。

该标准仅为此提供了低级单词。库可以提供一个单词,比如u-to-s将无符号数转换为文本。

: u-to-s ( u -- c-addr u ) 0 <# #s #> ;

结果( c-addr u )位于瞬态缓冲区中。

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

: 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
于 2020-09-18T10:02:30.847 回答