Как записать что-нибудь в файлы из vars с помощью 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:

Я ссылаюсь на официальную документацию но я нигде не нашел, что я должен сделать, чтобы иметь правильный адрес памяти в зависимости от установленной мной переменной (может быть как текст, так и числа (оба)).


person francois P    schedule 17.09.2020    source источник


Ответы (2)


Франсуа,

В s" .test" r/w open-file throw fd-out получает ли fd-out правильное значение? Я бы ожидал to перед 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.

С этими изменениями должно работать, удачи!

person Willem Jager    schedule 18.09.2020
comment
поэтому мне нужно найти или определить слово для преобразования моего числа в строку и использовать его на этапе записи. & используйте строку также для вызова file-cloe . Я вернусь, чтобы сообщить вам, если и как это сработало. - person francois P; 18.09.2020
comment
вот новое тестовое решение: asciinema.org/a/360407 спасибо за вашу помощь и помощь рассылка по интересам :) оба . - person francois P; 18.09.2020

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
person ruvim    schedule 18.09.2020
comment
Это решение работает в последних версиях, но не в 0.7.3, все еще очень распространенной версии :), но я благодарю вас за ответ, я буду использовать [: testvar @ . ;] $tmp fd-out write-line throw в будущих сценариях. - person francois P; 18.09.2020