Probleme beim Festlegen von Array-Elementen in Forth

Oct 12 2020

Ich schreibe Code in Forth, der ein 12x12-Array von Zufallszahlen von 1 bis 8 erstellen soll.

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

Ich stelle jedoch fest, dass die Elemente 128 bis 131 meines Arrays immer viel größer sind als erwartet:

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

Wenn ich versuche, den Wert dieser Elemente einzeln zu ändern, ändert dies außerdem den Wert der anderen drei Elemente. Zum Beispiel, wenn ich codiere:

9 choose big_array 128 + c!

dann wird das Array:

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

Haben Sie eine Idee, warum diese spezifischen Elemente immer betroffen sind und ob es eine Möglichkeit gibt, dies zu verhindern?

Antworten

1 ruvim Oct 12 2020 at 23:12

Bessere Lesbarkeit und weniger Fehleranfälligkeit: 144 allocate⇨144 chars allocate

Ein Fehler: create big_array 144 allocate drop⇨create big_array 144 chars allot

Ein Fehler: random um* nip⇨random swap mod

Ein Fehler: 144 1 do⇨144 0 do

Eine übermäßige Operation: big_array swap +⇨big_array +

Und fügen Sie bitte die Stapelkommentare hinzu. Vor allem, wenn Sie um Hilfe bitten.

Haben Sie eine Idee, warum diese spezifischen Elemente immer betroffen sind und ob es eine Möglichkeit gibt, dies zu verhindern?

Da Sie versuchen, Speicher im Wörterbuchbereich zu verwenden, ohne ihn zu reservieren. Dieser Speicher wird vom Forth-System verwendet.