【はじめてのプチコン】FOR文のバグ回避 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
現在、みなさんの使っているプチコンのベーシックにはバグがあります。
今までにみつかっているものについては確認をしておいてください。
そのうえで今回、サンプルの中で使っていたFOR文にバグがあります。
その内容と回避について説明します。


バグを起こすサンプルです。

■プログラム
0001 ' bug sample 1
0002 @LOOP
0003 FOR I=0 TO 9
0004 IF I==2 GOTO @LOOP
0005 NEXT I

■プログラム
0001 ' bug sample 2
0002 @LOOP
0003 GOSUB @SUB
0004 GOTO @LOOP
0005 @SUB
0006 FOR I=0 TO 9
0007 IF I==2 THEN RETURN
0008 NEXT I
0009 RETURN


どちらも Out of memory というエラーで止まります。
このようにエラーで実行が不可能で終了することをアボートといいます。

上のサンプルはFOR文のループの中で条件が成立した場合先頭の@LOOPに戻ります。
サンプルは無理やり条件が成功するようにしてありますが、
このプログラムはすでにゲーム中で使っています。
下のサンプルにおいては前回の検索で使用したコードとほぼ同じです。
ゲームの方では発射していない武器を捜すため配列 TK1_F の要素が0のものを探すためにFORを使いました。
これがエラーとなります。

じゃ、なんで今エラーがでないのと思われますが、
実はすぐにはエラーになりません。
ただし、遊んでいるとそのうちにアボートします。

この原因は簡単なのですがプログラム初心者の方には難解なので説明は省きます。
ただこのパターンは今後よく使います。
スマイルブームへメールしましたがこれについてもバグ修正はできているとの事だったのでアップデートで解決すると思います。
ただ、現在のままでいくかどうかなのですが、回避策をここで紹介しておきましょう。
本来FOR文はあるパターンのプログラムを簡略化するために作られた命令です。
要するに、プログラムのなかで良く使われるということです。

では下のサンプルを変更してみます。

■プログラム
0001 ' bug sample 2
0002 @LOOP
0003 GOSUB @SUB
0004 GOTO @LOOP
0005 @SUB
0006 'FOR I=0 TO 9
0007 I=0
0008 @FOR_LOOP
0009 IF I==2 THEN RETURN
0010 'NEXT I
0011 IF I==9 GOTO @FOR_END
0012 I=I+1
0013 GOTO @FOR_LOOP
0014 @FOR_END
0015 RETURN


今後、バグ修正があったらもとに戻す必要があるので元のFOR文は注釈にしてあります。
0006行目のFOR文の意味は・・・

①ループのカウントをする変数がIであり、初期値として0を代入
②変数は増分が1(STEP が省略されているので増分は1です)
③Iが9になるまでループ

0007行目では変数Iを0で初期化しています。(①の部分)
0008行目はループの先頭を表すラベルです。(FOR文では現れない)

0011行目は変数Iが終値であるかどうか判定し最後までループが実行されたらループから抜け出します。(③の部分)
0012行は変数Iに増分を加算します。(②の部分)
0013行はループの先頭に戻ります。
0014行はループから抜け出すためのラベルです。(FOR文では現れない)