Как мне прочитать что-то из 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@ .
Другие вопросы по тегам