新刊ピックアップ
ツールいらずのデバッグテクニック
2008年10月7日
バグのありか,わかりますか?
突然ですが,
ですが,
リスト1 バグのあるユークリッドの互除法
int gcm(int a, int b)
{
while (a !=b)
{
if (a > b)
{
a -= b;
}
else
{
b = a;
}
}
return a;
}
リスト1は,
本書の目的は,
『プログラミングのセオリー』
は, 筆者がプログラミングする際に常に心がけているセオリー (定石) をまとめたものです。 (中略) 本書で紹介しているのは, これまでの20年間で見出した代表的なセオリーです。筆者が信じているセオリーの多くが, 皆さんのプログラミングに磨きをかける一助となれば幸いです。
思いどおりに動かない。そんなときは……
話を元に戻しましょう。gcm関数の引数に,
プログラムの動作が思いどおりにならないときに使えるセオリーが
リスト2 printfデバッグを追加
#include <stdio.h>
int gcm(int a, int b)
{
printf("a = %d, b = %d\n", a, b); // DEBUG
while (a !=b)
{
if (a > b)
{
a -= b;
}
else
{
b = a;
}
printf("a = %d, b = %d\n", a, b); // DEBUG
}
return a;
}
リスト2の実行結果は次のようになります。
a = 30, b = 42
a = 30, b = 30
printfデバッグでプログラムを追う
printfデバッグの結果,
どうでしょう? バグが見つかったでしょうか? 不具合の原因は,
a = 30, b = 42
a = 30, b = 12
a = 18, b = 12
a = 6, b = 12
a = 6, b = 6
手元にデバッガがない環境でプログラミングするときや,
記事中で紹介した書籍
-
プログラミングのセオリー プログラムの価値を高める"定石"を学ぶ
書籍,雑誌,セミナーと,そのわかりやすい解説で多くのプログラマから支持を集める矢沢久雄氏の書き下ろしです。 プログラマとしてより高いレベルを目指す方を対象に...