Problèmes avec la définition des éléments de tableau dans Forth
J'écris du code dans Forth qui devrait créer un tableau 12x12 de nombres aléatoires de 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
Cependant, je remarque que les éléments 128 à 131 de mon tableau sont toujours beaucoup plus gros que prévu:
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
De plus, lorsque j'essaye de changer la valeur de ces éléments individuellement, cela fait changer la valeur des trois autres éléments. Par exemple, si je code:
9 choose big_array 128 + c!
alors le tableau deviendra:
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
Avez-vous une idée de la raison pour laquelle ces éléments spécifiques sont toujours impactés et s'il existe un moyen de l'empêcher?
Réponses
Meilleure lisibilité et moins sujet aux erreurs: 144 allocate⇨144 chars allocate
Une erreur: create big_array 144 allocate drop⇨create big_array 144 chars allot
Une erreur: random um* nip⇨random swap mod
Une erreur: 144 1 do⇨144 0 do
Une opération excessive: big_array swap +⇨big_array +
Et ajoutez les commentaires de la pile, s'il vous plaît. Surtout lorsque vous demandez de l'aide.
Avez-vous une idée de la raison pour laquelle ces éléments spécifiques sont toujours impactés et s'il existe un moyen de l'empêcher?
Puisque vous essayez d'utiliser la mémoire dans l'espace du dictionnaire sans la réserver. Cette mémoire est utilisée par le système Forth.