Problemas com a definição de elementos da matriz em Forth

Oct 12 2020

Estou escrevendo um código no Forth que deve criar uma matriz 12x12 de números aleatórios de 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

No entanto, noto que os elementos 128 a 131 da minha matriz são sempre muito maiores do que o esperado:

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

Além disso, quando tento alterar o valor desses elementos individualmente, isso faz com que os outros três elementos mudem de valor. Por exemplo, se eu codificar:

9 choose big_array 128 + c!

então a matriz se tornará:

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

Você tem ideia de por que esses elementos específicos são sempre impactados e se existe uma maneira de evitar isso?

Respostas

1 ruvim Oct 12 2020 at 23:12

Melhor legibilidade e menos sujeito a erros: 144 allocate⇨144 chars allocate

Um erro: create big_array 144 allocate drop⇨create big_array 144 chars allot

Um erro: random um* nip⇨random swap mod

Um erro: 144 1 do⇨144 0 do

Uma operação excessiva: big_array swap +⇨big_array +

E adicione os comentários da pilha, por favor. Principalmente quando você pede ajuda.

Você tem ideia de por que esses elementos específicos são sempre impactados e se existe uma maneira de evitar isso?

Já que você tenta usar a memória no espaço do dicionário sem reservá-la. Esta memória é usada pelo sistema Forth.