2

我正在用 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

您知道为什么这些特定元素总是会受到影响,是否有办法防止这种情况发生?

4

1 回答 1

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 系统使用该内存。

于 2020-10-12T16:12:43.623 回答