Probleme beim Festlegen von Array-Elementen in Forth
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
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.