Problemi con l'impostazione degli elementi dell'array in Forth

Oct 12 2020

Sto scrivendo del codice in Forth che dovrebbe creare un array 12x12 di numeri casuali da 1 a 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

Tuttavia, noto che gli elementi da 128 a 131 del mio array sono sempre molto più grandi del previsto:

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

Inoltre, quando provo a modificare il valore di questi elementi individualmente, ciò fa sì che gli altri tre elementi cambino valore. Ad esempio, se codice:

9 choose big_array 128 + c!

quindi l'array diventerà:

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

Hai idea del motivo per cui questi elementi specifici sono sempre influenzati e se esiste un modo per evitarlo?

Risposte

1 ruvim Oct 12 2020 at 23:12

Migliore leggibilità e meno soggetto a errori: 144 allocate⇨144 chars allocate

Un errore: create big_array 144 allocate drop⇨create big_array 144 chars allot

Un errore: random um* nip⇨random swap mod

Un errore: 144 1 do⇨144 0 do

Un'operazione eccessiva: big_array swap +⇨big_array +

E aggiungi i commenti dello stack, per favore. Soprattutto quando chiedi aiuto.

Hai idea del motivo per cui questi elementi specifici sono sempre influenzati e se esiste un modo per evitarlo?

Dal momento che si tenta di utilizzare la memoria nello spazio del dizionario senza riservarla. Questa memoria viene utilizzata dal sistema Forth.