Как мне прочитать что-то из stdin в gforth и сохранить это в переменной?
Я попробовал следующий код после прочтения документов:
create buff 128 allot
buff 128 stdin read-line throw
Я надеялся, что это даст мне символ для каждого последующего адреса баффа, но я получаю странное число:
buff @ ok
. 3689349013085184353 ok
Что мне здесь не хватает?
1 ответ
buff
поставить адрес своего buff
переменная в стеке (данных). Память по этому адресу содержала данные, полученные от stdin
, что-то вроде этого:
Address Value
------- -----
N+0 0x61
N+1 0x61
N+2 0x61
N+3 0x61
N+4 0x61
N+5 0x33
N+6 0x33
N+7 0x33
... ...
@
слово преобразовало адрес, оставленный buff
в целочисленное значение по этому адресу. Но так как у вас (по-видимому) есть 64-битный gforth
версия, @
вернул 64-битное, т. е. 8-байтовое значение, начиная с указанного адреса, т. е. 0x3333336161616161
, который 3689349013085184353
в десятичном. .
Слово только что показало вам это число.
Если вы хотите получить определенный байт, используйте c@
вместо @
:
buff c@ .
Это даст вам код первого символа в буфере (0x61
или же 97
). Если вы хотите получить второй элемент, увеличьте адрес перед выполнением c@
, как это:
buff 1+ c@ .
Точно так же вы получите код шестого символа:
buff 5 + c@ .