とりあえずループとかではちゃんとインデントしような?
指摘するところとしては、
>repeat 7
>item(cnt)=str(item(cnt))
>loop
この存在意義が謎。itemは整数型(dimで宣言しているから)なのに、
いちいちstr関数で文字列にしてまた代入する意味がない。
>svd=""+item(0)+","+item(1)+","+item(2)+","+item(3)+","+item(4)+","+item(5)+","+item(6)+""//アイテム数を入力
変数名をいちいちコピペしてずらずら並べていたら面倒にもほどがあるのでfor文を使うべき。
>notesel save
>noteadd svd,7,1
>money=str(money)
>noteadd money,1,1
この辺がガチで意味不明。意図としては、
--------------------
01 money
02 item(0)
03 item(1)
04 item(2)
05 item(3)
06 item(4)
07 item(5)
08 item(6)
--------------------
といった感じで(先頭の2桁数字は行番号)、note系命令で書き込み&読み出し
したかったのだろうと思う。ただ、そっちが書いたコードだと、こういった
ことにはならない。と言うか、noteadd命令の第3引数が「1」(上書き)だから、
noteselで選択された変数saveにあらかじめ(複数行の)文字データが書かれていないと
noteaddしてもまるで意味が無い(上書きできないから)。
こういったカオスなコードになってしまったのは、
・「データをテキスト形式で保存するのには一旦文字列の形式に変数を変換しなければならない」
という誤解
・note系命令にまだ慣れていない(あまり自分で実験したことがないorサンプル読んでないから?)
というのが根底にあると思う。ちなみに、そちらが意図するように適切に書き直したのが次の通り。
(コメントは私の主観で追加させてもらった。別に無視してくれても構わない)
item_num = 7 ;アイテム数(将来の設定変更に備える)
dim item,item_num ;アイテムの情報を保存するための配列
;(何の数値データかは私には分からないが)
money = 500 ;所持金情報……かな?
;「*back」が何を意図するラベルかが分からない‥…まあそこは個人の自由だが
*back
;ファイルにセーブするルーチン
notesel save ;noteselで指定する変数は、別にsdimしなくても問題ない(HSPの仕様)
save += "" + money + "\n" ;""を足し算で先行させると、以降は文字列に変換される(HSPの仕様)
;note系命令で扱うのは要するに改行付き文字列なので、
;noteaddを使わなくても中のデータは普通に作れるのだ
repeat item_num ;別にforeach文でもいい。その場合、「foreach item」となる
save += "" + item(cnt) + "\n" ;配列を1つづつ文字列として変数saveに書き込む
loop
notesave"save.txt" ;save.txtというファイルにテキスト形式で保存
;メインルーチンに戻る……という意味でいいよね?
goto *main
なお、↑のコードに対する「ファイルからロードするルーチン」はこんな感じ。
;ファイルからロードするルーチン
notesel buf ;読み込むためのバッファ(自動で領域が確保されるため、sdimで用意する必要はない)
noteload "save.txt" ;読み込み(この段階で、bufは改行付き文字列としてデータが用意される)
noteget getline, 0 ;「0」(1行目)をgetlineに文字列として読み込む。
;ここでも「sdim getline, 200」などのように、領域を確保する必要はない
money = int(getline) ;int型に文字列を変換
repeat item_num ;配列に順に読み込んでいく
noteget getline, cnt + 1 ;「1」(2行目)から順に読み込む
item(cnt) = int(getline)
loop