Aritalab:Lecture/Programming/Debug
From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
(→Print Debug) |
(→Assert Debug) |
||
Line 15: | Line 15: | ||
==Assert Debug== | ==Assert Debug== | ||
+ | 最近のプログラミング本で紹介されるのが、assert文です。 | ||
assertとは「主張」の意味で、プログラム実行中にtrue/falseを検証するために使います。 | assertとは「主張」の意味で、プログラム実行中にtrue/falseを検証するために使います。 | ||
assert文で検証するのは「真とみなされる論理式」である点に注意してください。 | assert文で検証するのは「真とみなされる論理式」である点に注意してください。 | ||
===Javaの場合=== | ===Javaの場合=== | ||
+ | Java言語はassertを言語仕様としてサポートしています。 | ||
Javaの場合は、エラーメッセージを出力することができます。 | Javaの場合は、エラーメッセージを出力することができます。 | ||
<pre> | <pre> | ||
Line 25: | Line 27: | ||
===C++の場合=== | ===C++の場合=== | ||
− | C++ | + | C++におけるassert文は単なるマクロです。 |
+ | 以下のようにして使えます。 | ||
<pre> | <pre> | ||
Line 36: | Line 39: | ||
直前のNDEBUGをコメントアウトすると、No Debugの意味でプログラム中のassert文を全てコンパイル時に無視します。 | 直前のNDEBUGをコメントアウトすると、No Debugの意味でプログラム中のassert文を全てコンパイル時に無視します。 | ||
つまり、ソースプログラムを変更しなくても実行速度が落ちないデバッグを実現できます。 | つまり、ソースプログラムを変更しなくても実行速度が落ちないデバッグを実現できます。 | ||
− | + | しかし、このassert文はエラーメッセージを出さないので問題部分の特定がしづらく、使いづらいです。 | |
− | + | そこで以下のマクロを自分で定義しても良いでしょう。 | |
<pre> | <pre> | ||
#define ASSERT( condition, message ){\ | #define ASSERT( condition, message ){\ |
Revision as of 16:07, 12 October 2010
Contents |
Debugの仕方
Print Debug
いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。
const bool PDEBUG = true; : : if (PDEBUG) { ... printf(変数); ...}
デバッグに使う文を全てPDEBUGというブール定数の下に置いておけば、デバッグ終了後にPDEBUG = false;と置くだけでデバッグ用のコードは全てコンパイル時に無視されます。(if文の条件部が定数のfalseであるため。)
この仕組みで効率的なデバッグは十分可能です。
Assert Debug
最近のプログラミング本で紹介されるのが、assert文です。 assertとは「主張」の意味で、プログラム実行中にtrue/falseを検証するために使います。 assert文で検証するのは「真とみなされる論理式」である点に注意してください。
Javaの場合
Java言語はassertを言語仕様としてサポートしています。 Javaの場合は、エラーメッセージを出力することができます。
assert denominator != 0 : "Division by zero!";
C++の場合
C++におけるassert文は単なるマクロです。 以下のようにして使えます。
/* #define NDEBUG */ #include <assert.h> : : assert( ...);
直前のNDEBUGをコメントアウトすると、No Debugの意味でプログラム中のassert文を全てコンパイル時に無視します。 つまり、ソースプログラムを変更しなくても実行速度が落ちないデバッグを実現できます。 しかし、このassert文はエラーメッセージを出さないので問題部分の特定がしづらく、使いづらいです。
そこで以下のマクロを自分で定義しても良いでしょう。
#define ASSERT( condition, message ){\ if ( !(condition) ) { \ Error( "Assertion: ",(message),\ (__FILE__),(__LINE__) ); \ exit( -1 ); } } static void Error (const char* label, const char* msg, const char* fname, const int line) { //最低限の処理 printf("%s %s %s %d", label, msg, fname, line); }