昨日に引き続きバグ修正。昨日の分はほぼ終わったので、今日は別のバグ。ずっと前から気になっていた箇所なのだが、あまり使う機能ではないので後回しになっていた。1000×1000の配列を順に移動し、N×Mの格子点に来たら特定の動作を実行するというもの。ただし、配列の外周の位置では実行しない。
いままでは移動のたびに現在位置が格子点かどうかを計算して判別していた。これだと、配列のサイズが格子の大きさで割り切れない場合に不整合が起こっていた。また、if文の階層が深くなってしまっていた。
今回の修正では、縦と横の配列サイズに対応するビットテーブルを用意して、実行する位置に対応するビットを立てておく。移動中はこのテーブルを参照して動作を行うかどうかを判別する。
例えば、20×20の配列を3×2の格子に分割する場合、ビットテーブルはこんな感じになる。

ビットの並び
table_x = 00001000010000100000
table_y = 00000010000001000000

この修正で動作は正常になった。実行速度も問題無い。少し消費メモリが大きくなるが、これはアクセスが遅いかわりにサイズの大きいメモリセクションに割り当てることで解消した。画面に格子点を正しく表示させることと、ビットテーブルの初期化にミスがあったが、簡単に修正して終了。
やはり冬場は調子が良い。