微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用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:

我指的是official documentation,但根据所设置的变量(可以是文本和数字(两者)),我什么地方也找不到正确的内存地址。

解决方法

Francois,

s" .test" r/w open-file throw fd-out中,fd-out是否获得正确的值?假设to是用Value定义的,我希望在fd_out之前有fd_out

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。