コンピュータに与えるプログラムに含まれる論理的誤りのことを バグ という。
プログラムにひそんだバグを取り除く作業のことをデバッグ とい う。デバッグするためには、プログラムが動くときのことを頭の中で追いかける 必要があるので、文法エラーを取り除くのよりはるかに時間がかかる。プログラ ムを作る過程では、最初に書き進めて行く時間よりも後から間違いを直す(デバッ グする)時間の方が長いと。熟練するにつれ、デバッグにかかる時間が短くなり、 同時に最初からバグのないプログラムが作れるようになる。
授業で作るプログラムも徐々に複雑になっていくので、プログラミングに掛 ける時間を節約する意味で、
を覚えておこう。
if, while, open
などは必ず対応する
end
を書く必要がある。にもかかわらずend
を忘れでエラーになることが最初のうちは多い。end
を後
で入れるから忘れるのである。あとでend
が必要な
構文を書いたら、すぐに前もってend
を書くよ
うにすると忘れない。
if y%3 == 3 then ←endを書いてから中味を書き始める end
大事な意味を持つ変数を、x
とかx2
無味乾燥な名前にせず、maxninzu, goukei
といった
値の意味が想像しやすい名前にする。
また、変数名のスペルミスでエラーになるのは悲しいので、 積極的に補完を利用する。Emacsであれば単語を2〜3文字打った状態で M-/ を押すとバッファ内に同じ単語があったときに 単語の残り部分を補ってくれる。
制御構造や条件分岐にはかならず意味があるはずである。 意味を表すようなコメントを書いておく。
無意味なコメントの例
point=[] # point配列を用意 sum=0 # sumを0にする i=0 # iを0にする while line=gets # getsの間繰り返す point[i] = line.to_i # point[i]にline.to_iを代入 sum += point[i] # sumにpoint[i]を足す i += 1 # iに1を足す end
意味のあるコメントの例
point=[] # 全員分の得点を記憶する配列 sum=0 # 合計を保存する変数をクリア i=0 # 今何人目か while line=gets # 入力が続く間繰り返す point[i] = line.to_i # i人目の得点を記憶 sum += point[i] # 合計得点に追加 i += 1 end
Emacsであれば、M-;(メタセミコロン)をタイプすると簡単に
決まった桁位置に #
が入れられる。
printf
デバッグプログラミングの初歩の段階では、変数の値が未定義だったり、
変数の値を変えずにループを作って暴走させてしまったりと、
変数の値が予期せぬ状態になっていることが原因のバグが多い。
これを確認するために、現在の変数の値を要所要所で出力する
printf
をさし込むと良い。
line=gets
while match > 0
printf("debug: 今のマッチは%d本\n", match);
:
:
end
このように、printf
を挟んで、そのときの変数状態を
表示してデバッグする方法を、printf
デバッグ
といい、初歩的ではあるが複雑なプログラミングのときにも
有効な方法である。