Проблемы с установкой элементов массива в Forth

Я пишу код на Forth, который должен создать массив случайных чисел 12x12 от 1 до 8.

create big_array 144 allocate drop
: reset_array big_array 144 0 fill ;
reset_array 
variable rnd here rnd !
: random rnd @ 31421 * 6927 + dup rnd ! ;
: choose random um* nip ;
: random_fill 144 1 do 8 choose big_array i + c! loop ;
random_fill
: Array_@ 12 * + big_array swap + c@ ;
: show_small_array cr 12 0 do 12 0 do i j Array_@ 5 u.r loop cr loop ;
show_small_array

Однако я заметил, что элементы со 128 по 131 моего массива всегда намного больше, чем ожидалось:

0    4    0    4    2    6    0    5    2    5    7    3
6    3    7    3    7    7    3    1    5    0    6    1
0    3    3    0    3    1    0    7    2    0    4    5
3    7    6    6    2    1    0    2    3    4    2    7
4    7    1    5    3    5    7    2    3    5    3    6
3    0    6    4    1    3    3    2    5    4    4    7
3    2    1    4    3    4    3    7    2    6    5    5
2    4    4    3    4    5    4    4    6    5    6    0
2    5    2    7    3    1    5    0    1    4    6    7
2    0    3    3    0    7    3    6    4    1    3    6
0    1    1    6    0    3    0    2  169  112   41   70
7    2    3    1    2    2    7    6    0    5    1    2

Более того, когда я пытаюсь изменить значение этих элементов по отдельности, это приводит к изменению значения трех других элементов. Например, если я кодирую:

9 choose big_array 128 + c!

тогда массив станет:

0    4    0    4    2    6    0    5    2    5    7    3
6    3    7    3    7    7    3    1    5    0    6    1
0    3    3    0    3    1    0    7    2    0    4    5
3    7    6    6    2    1    0    2    3    4    2    7
4    7    1    5    3    5    7    2    3    5    3    6
3    0    6    4    1    3    3    2    5    4    4    7
3    2    1    4    3    4    3    7    2    6    5    5
2    4    4    3    4    5    4    4    6    5    6    0
2    5    2    7    3    1    5    0    1    4    6    7
2    0    3    3    0    7    3    6    4    1    3    6
0    1    1    6    0    3    0    2    2   12  194   69
7    2    3    1    2    2    7    6    0    5    1    2

Есть ли у вас какие-либо идеи, почему эти конкретные элементы всегда подвержены влиянию и есть ли способ предотвратить это?


person doraymefaso    schedule 12.10.2020    source источник


Ответы (1)


Лучшая читабельность и меньше ошибок: 144 allocate144 chars allocate

Ошибка: create big_array 144 allocate dropcreate big_array 144 chars allot

Ошибка: random um* niprandom swap mod

Ошибка: 144 1 do144 0 do

Чрезмерная операция: big_array swap +big_array +

И добавьте комментарии к стеку, пожалуйста. Особенно когда просишь о помощи.

Есть ли у вас какие-либо идеи, почему эти конкретные элементы всегда подвержены влиянию и есть ли способ предотвратить это?

Поскольку вы пытаетесь использовать память в пространстве словаря, не резервируя ее. Эта память используется системой Forth.

person ruvim    schedule 12.10.2020
comment
Я не согласен с тем, что использование chars более читабельно или менее подвержено ошибкам. - person Veltas; 22.11.2020
comment
1) В Forth-94 размер символа может составлять несколько адресных единиц. 2) Используя «символы», вы показываете намерение, что это блок символов (даже если размер символа составляет 1 адресную единицу). 3) Когда вы всегда используете символы/ячейки, у вас меньше шансов пропустить «ячейки». - person ruvim; 23.11.2020
comment
Это не объясняет, почему он более удобочитаем или менее подвержен ошибкам. Это менее портативно, конечно. Не для того, чтобы провоцировать или предполагать, что это аргумент, потому что я уважаю «соответствие» как желание, даже если оно непрактично, но знаете ли вы на самом деле Форт, где тип символа — это множественные адресные единицы? - person Veltas; 23.11.2020
comment
Новичок часто пропускает "ячейки" (пример) (т. е. факультативный вариант более подвержен ошибкам). Если размер рассчитан, я (как читатель) вижу, что автор не упустил этот момент (т.е. лучшую читабельность). В dsForth размер символа был два а.е. NB: с 2017 года использование char›au является экологическим ограничением системы. . - person ruvim; 24.11.2020