<地獄のバグ黙示録Series> 2004.01/14改訂

 ここでは筆者のプログラム開発の経験で中々発見が難しかった「地獄のバグ&恥ずかしいバグ」に迫ります.何かの参考に

1.For Next文中でカウンタ変数をいじってしまう
 初期の頃によく犯したミス
     for i = 0 to 10
          ----
           i=k
           ----
      next i
 などと途中でカウント変数 i を変えてしまう.

2.乱数系列が循環してしまう
 碁石モデルの解析途中で,どうしてもサイズ−頻度分布のlog‐logプロットにある縞模様(つまり、サイズがばらつかずに特有の大きさに偏りが生じ る)ができることに気づいた.これ数年前の合同大会の発表用の計算だったのでかなり焦ったが,乱数を多用していたのでその系列が繰り返すためではないかと気づいた。それで途中で 周期的に乱数の種の更新を行う(種は分,秒よりランダムに選ぶ)ことにして,解決した.乱数を多く使うプログラムでは要注意! 

3.赤緯のプロットミス
 星座早見の星図のオリオン座の3星の形がずっとおかしく,これはデータのバグだとここ10年思っていたが,今日プロットルーチンの初歩的なミスだと気づいた.下記にミスを列記する.
赤緯をファイルから読み取る部分でDCが赤緯
2770  DCH$=MID$(OP$,21, 3)
2780  DCM$=MID$(OP$,25, 2)
2790  DCS$=MID$(OP$,28, 2)
2800  DC=VAL(DCH$)+VAL(DCM$)/60+VAL(DCS$)/3600
というものだが正しくは
2770  DCH$=MID$(OP$,21, 3)
2780  DCM$=MID$(OP$,25, 2)
2790  DCS$=MID$(OP$,28, 2)
2792  if VAL(DCH$)<0 then 2810
2800  DC=VAL(DCH$)+VAL(DCM$)/60+VAL(DCS$)/3600: goto 2820
2810  DC=VAL(DCH$)-VAL(DCM$)/60-VAL(DCS$)/3600    ' big bug!(2001.03/25)
でなければいけない.
星のデータは
132444   5 40 45.5   -1 56 34   0.000  0.00   1.77 -0.21  O9  +18  340s   *
ここで赤緯は
-1 56 34なので分,秒には符号が及ん でいないことに気づかなかったというお粗末.
さて震源のプロット方は大丈夫かな?

4.変数の定義型
 −−しかし自宅でレンダリングするとなぜか四角い妙な領域が縁に現れる.一難去ってまた一難といつもの苦労.目を皿のようにリストを辿るがよくわからな い.if〜elseのどこかに漏れがあるのか?あるいは実数,整数のくだらない型不一致か?(後日,これ結局,整数型で定義してた格子の定義変数を実数型にすることで回避された.staggard gridなので0.5格子の定義が出てくる のを忘れていたお粗末!
 このあと,if文を検証.最初の条件文ではなく,代入された密度の配列変数で絵を書かせたところ,出てきましたバグが!やはり媒介変数表示のカージオイドがらみの部分がどうもうまく定義されてい ないことが解った.これもっと簡単に楕円か半円で定義することに変更.まずはbug発見めでたし.

5.if分による塗り分け(なぜ塗り分けができないのだろ う?)
プログラム歴,かれこれ15年になるのに未だにこんな リストを書いてしまう私って−−−−−?
      if (h[i][j]>0){
        if (w[i][j]>16)
        cl=1;
        if (w[i][j]>12)
        cl=2;
途中略
        if (w[i][j]>-12)
        cl=9;
        if (w[i][j]>-16)
        cl=10;
        else
        cl=14;}
      else
        cl=0;

もちろん正解は
      if (h[i][j]>0){
        if (w[i][j]>16)
        cl=1;
        else if (w[i][j]>12)
        cl=2;
        else if (w[i][j]>8)
途中略
        else if (w[i][j]>-12)
        cl=9;
        else if (w[i][j]>-16)
        cl=10;
        else
        cl=14;}
      else
        cl=0;

Copyright (c) 2000-2005 Y.Okamoto, all rights reserved.