ひどいバグ

 先ほどオセロプログラムの調整をしていたら、とんでもないバグに気づいた。



OPEN_MAX


 今まで上のような定数を開放度の最大値としてプログラム中で使っていた。値は10。


 そして先ほど、開放度で石をソートしているところの調整をしていたときにそのおかしさに気が付いた。この開放度の値は盤面に石が置かれるごとに減っていき、増えることなどない。つまり、開放度を表す値の最大値は10なのである。


 ところが、ソートを確認するために開放度の値を取得するとなにかおかしい、256などという値が開放度の値として入っているではないか。
 これは一体なんなのか、もしかして開放度を計算し直す部分に間違いがあるのか、などと考えていた。しかし、アルゴリズムに間違いがあるわけではなかった。


 このOPEN_MAXという定数。実はlimits.hというヘッダファイルに定義されている定数だったのだ。その値が256。
 普段はlimits.hなどというヘッダファイルを読み込むことなどないのだが、そのときはint型の最大値が知りたかったためにそのヘッダファイルを読み込んでいた。そして、このlimits.hを読み込んでいる部分が俺のプログラム中でOPEN_MAXが定義されている部分より後だった。


 C言語の仕様を詳しく知らないが、後に定義されたものが優先されるのだろうか。てっきり同じ定数が定義されるとエラーが出されるものだと思っていた。


 しかし、こんなバグは初めてだった。いい経験になった。
 忘れないためにここに書いておこう。