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