ワンポイントテクニック No.026 

FORとNEXTのペアを変更する


 FOR〜NEXTを条件判断用に使えば高速化が可能になるという場合もありますが、実はさらなる有効活用方法があるのです。
 FOR〜NEXTはスタックメモリの関係上、最大6段まで深みを持たせることが可能になっています。6段のFOR〜NEXTを使用した場合、最も単純なものは下記のようなものになります。

10 FOR A=1 TO 9
20 FOR B=1 TO 8
30 FOR C=1 TO 7
40 FOR D=1 TO 6
50 FOR E=1 TO 5
60 FOR F=1 TO 4
70 NEXT
80 NEXT
90 NEXT
100 NEXT
110 NEXT
120 NEXT

 単純なのでそれぞれどのFORとNEXTが対応しているのかはすぐに分かると思います。
 では、70行のNEXTの後にCを付けてみてください。この場合のFORとNEXTの対応が分かりますか?
 実は、80行のNEXTはBに対応、90行のNEXTはAに対応、100〜120のNEXTは不要になるのです。要は40行〜60行のFORはNEXTが存在しない状態で存在しているため見た目は6段ですが、実質3段となっています。つまり、NEXTの後に意図的に変数名を付けることで強制的にFORとNEXTのペアを変えることができるのです。(変数を省略すれば最後に実行したFORと対になるというだけ)
 次に70行を元に戻し、60行を30行と同じFOR C=1 TO 7にしてみてください。すると65行に65 FOR G=1 TO 3:NEXTを追加してもエラーにならなくなります。つまり、仕様上最大の6段を越える7段で使えるわけですが、実はそうではありません。同じ変数名を使用すると後のものが有効になり前のものが無効になるため30行と60行を同じにすれば60行のFOR C=1 TO 9の方のみが有効で30行の方は無視されるからです。(つまり、一見して7段だけど実質6段)

 上記をまとめると下記の2通りの特殊な使用方法があるということです。
(1)意図的なNEXTの変数名指定によりペアの強制変更
      
  • FOR〜NEXTを多段使用していた時に一気にループを終了したい時に使用できます。
    ※NEXTの前に終了したいFOR文の終了値を指定した場合(上記リストでNEXT Cとする場合はNEXTの前にC=7を置く)
      
  • FOR〜NEXTを多段使用していた時にNEXTから特定のFORへ戻りたい時に使用できます。
    ※同 終了値を指定しない場合

(2)同じ変数名でFORを使うことで前者を無効化
      
  • メインルーチンが複数存在する場合にそれを簡単に使い分けができます。

 (2)をもう少し詳しく説明すると1人用(コンピュータとの対戦)、2人用でプレイできるゲームを作る場合、大半の処理は共通ですが部分的に異なる場合があります。それは1人用モードか2人用モードかをメインルーチン内で判別すれば良いのですがそれだと余分なIF文が必要になってしまいます。
 しかし、FOR〜NEXTを多対1で用意すればどんな条件であろうとそれをメインルーチン内で判断することなく複数の処理を使い分けることが可能になります。(IF文1つ分だけ高速化)

(中略)
80 IF P=2 THEN 200 'P=1 1人用、P=2 2人用
90 'メインルーチン
100 FOR I=1 TO 99
(1人用モード専用ルーチン)
190 GOTO 300
200 FOR I=1 TO 99
(2人用モード専用ルーチン)
300(この行から1人用、2人用共通ルーチン)
(中略)
400 NEXT

 FOR〜NEXTは基本的に1対1で使用するものですが、それを意図的に変更することによって省メモリ化や高速化ができる場合があります。ただし、このような方法を用いるとFORとNEXTの対応が非常に分かりにくくなるためにFOR〜NEXTがどのように動作しているのか、明確に分かっている人のみ使用をおすすめします。場合によってはループが終了しない場合もあり、ゲームのリトライなどで先頭行に戻った場合にCLEARやDIMが実行されるとその行がエラーになりその原因解明が困難になってしまいますからね。


RETURN

inserted by FC2 system