#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
его в будущих сценариях.