Как записать что-либо в файлы из vars с помощью gforth?

#forth #gforth

#далее #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:
  

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

Ответ №1:

Франсуа,

Получает 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 ) file: Общие файлы), а не только fd_out .

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

Комментарии:

1. итак, мне нужно найти или определить слово, чтобы преобразовать мое число в строку, и использовать его на шаге записи. amp; используйте строку также для вызова file-cloe . Я вернусь, чтобы сообщить вам, если и как это сработало.

2. вот новое тестовое решение: asciinema.org/a/360407 спасибо за вашу собственную помощь и группе по интересам gforth mailling 🙂 обоим.

Ответ №2:

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 ) word, который перенаправляет вывод во временную строку. Итак, вы можете сделать

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

Комментарии:

1. Это решение работает на последних версиях, но не на 0.7.3, все еще очень распространенной версии 🙂 но я благодарю вас за ответ, я буду использовать [: testvar @ . ;] $tmp fd-out write-line throw его в будущих сценариях.