配列を合計するプログラムを作成しようとしていますが、単語 sum を実行しようとすると、アドレスに似た非常に長い数値が表示され続けます。私はそれを分解して、ターミナルの単語の外で行ごとに実行しようとしましたが、手動でループするとうまくいきましたが、実際に機能させると完全に失敗します。私は何を間違っていますか?
variable length \ length var declared
create list \ space for my list made
0 variable cumsum \ sum value initialized to zero
: upload ( n1 n2 n3 --) \ loops thru and stuffs data into array
depth ( n1 n2 n3 -- n1 n2 n3 depth) \ get depth
length ! ( n1 n2 n3 depth -- n1 n2 n3) \ array length stored
list ( n1 n2 n3 -- n1 n2 n3 addr)
length @ ( n1 n2 n3 addr -- n1 n2 n3 addr nlength)
cells allot ( n1 n2 n3 addr nlength -- n1 n2 n3)
length @ 1+ ( n1 n2 n3 -- n1 n2 n3 nlength) \ consume all entries
0 ( n1 n2 n3 nl -- n1 n2 n3 nl 0) \ lower loop parameter..
do ( n1 n2 n3 nl 0 -- n1 n2 n3) \ loop begins
list ( n1 n2 n3 -- n1 n2 n3 addr)
I ( n1 n2 n3 addr -- n1 n2 n3 addr I) \ calculating address
cells ( n1 n2 n3 addr I -- n1 n2 n3 addr Ibytes)
+ ( n1 n2 n3 addr Ibytes -- n1 n2 n3 addr1+)
! ( n1 n2 n3 addr1+ -- n1 n2) \ storing into calculated address
loop
;
アップロードは魅力のように機能しますが、後でこの単語を使用します
: sum ( n1 n2 n3 -- nsum)
upload \ initiates the array
length @ \ invokes upper limit of loop
0 \ lower limit of loop
do
list ( -- addr) \ addr invoked
I cells + ( addr -- addr+) \ offset calculated and added
@ ( addr+ -- nl) \ registered value at address fetched
cumsum @ ( nl -- nl ncs) \ cum sum value fetched to stack
+ ( nl ncs -- nsum) \ summation
cumsum ! ( nsum --) \ new sum written to cumsum
loop
cumsum ? ( -- cumsum) \ show sum
;
そして、アドレスのように見える非常に長い数値を返します。これは、テストのために追加した小さな数値のリストの合計ではありません。
1 ok
2 ok
3 ok
sum 140313777201982 ok