问题描述
我正在用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
您是否知道为什么这些特定元素总是会受到影响以及是否有防止这种情况的方法?
解决方法
更好的可读性和更少的错误发生:144 allocate
⇨144 chars allocate
错误:create big_array 144 allocate drop
⇨create big_array 144 chars allot
错误:random um* nip
⇨random swap mod
错误:144 1 do
⇨144 0 do
过度操作:big_array swap +
⇨big_array +
请添加堆栈注释。特别是当您寻求帮助时。
您是否知道为什么这些特定元素总是会受到影响以及是否有防止这种情况的方法?
因为您尝试在字典空间中使用内存而不保留它。此内存由Forth系统使用。