在 Forth 中设置数组元素的问题
Problems with setting array elements in 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
您知道为什么这些特定元素总是受到影响吗?是否有办法避免这种情况?
更好的可读性和更不容易出错: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 +
请添加堆栈注释。特别是当你寻求帮助时。
Do you have any idea why these specific elements are always impacted and if there is a way to prevent this?
由于您尝试使用字典中的内存 space 而不保留它。此内存由 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
您知道为什么这些特定元素总是受到影响吗?是否有办法避免这种情况?
更好的可读性和更不容易出错: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 +
请添加堆栈注释。特别是当你寻求帮助时。
Do you have any idea why these specific elements are always impacted and if there is a way to prevent this?
由于您尝试使用字典中的内存 space 而不保留它。此内存由 Forth 系统使用。