以下のようなブレークポイントを張る事って可能ですか?
void C***Doc::SetPath(CString szPath)
{
m_szPath = szPath; ←ここに張る
m_szFilePath = szPath + FILE_NAME;
}
m_szPath、m_szFilePathはCStringです
←ここに張るの場所に条件として m_szPath == " か
m_szPath.IsEmpty()を設定したい
ヘルプをみて以下をしたのですがだめでした
←ここに張るの場所でF9を押して行番号のブレークポイントを設定した後に
Ctrl+Bでブレークポイント用のダイアログを開き
設定したポイントを選択した後に条件ボタンを押して
評価される式に上記の条件を記入しましたが、
エラーがでてプログラムの最初で停止します。
方法が間違っているのでしょうか?
私の知る限り,関数を呼び出して結果を判定するのは不可能です。
呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから。
なので,例えば,
m_szPath.m_pchData == 0 || *m_szPath.m_pchData == 0
のように,実装を調べて記述する必要があるかと。
ありがとうございます。
>関数を呼び出して結果を判定するのは不可能です
IsEmpty()もoperator == も関数だからダメなんですね。
>呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから
よく理解できないのですがこれはどういうことですか?
> > 呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから
> 理解できないのですがこれはどういうことですか?
たとえば,
char * g_p; /* グローバル変数 */
/* ブレイクポイントチェック用の関数 */
int erase_pointer (void)
{
g_p = 0; /* 副作用 */
return 1;
}
/* 本流の関数の中 */
if (g_p != 0) {
puts(g_p); /* ここにブレイクポイント。条件として!erase_pointer()を指定。 */
こんなときです。
#非常に作為的ですが。
プログラムは,g_pがifの条件式とputsの引数評価の間で変化しないと考えて書いていますが,
デバッガによってg_pがNULLに書き換えられてしまい,putsで未定義動作となってしまいます。
これを,気付かずに行うとブレイクポイントの設定がバグの元になってしまいます。
ありがとうございます。
すごくわかりやすいです!!
そーいうことですか。わかりました。