ブレークポイントの設定 – プログラミング – Home

ブレークポイントの設定
 
通知
すべてクリア

[解決済] ブレークポイントの設定


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

以下のようなブレークポイントを張る事って可能ですか?

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でブレークポイント用のダイアログを開き
設定したポイントを選択した後に条件ボタンを押して
評価される式に上記の条件を記入しましたが、
エラーがでてプログラムの最初で停止します。

方法が間違っているのでしょうか?


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 23年前
投稿: 252
 

私の知る限り,関数を呼び出して結果を判定するのは不可能です。
呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから。

なので,例えば,
m_szPath.m_pchData == 0 || *m_szPath.m_pchData == 0
のように,実装を調べて記述する必要があるかと。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

>関数を呼び出して結果を判定するのは不可能です
IsEmpty()もoperator == も関数だからダメなんですね。

>呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから
よく理解できないのですがこれはどういうことですか?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 23年前
投稿: 252
 

> > 呼び出した関数が副作用を伴うと,デバッガが状況をメチャクチャにすることになりますから
> 理解できないのですがこれはどういうことですか?

たとえば,
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で未定義動作となってしまいます。

これを,気付かずに行うとブレイクポイントの設定がバグの元になってしまいます。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

すごくわかりやすいです!!
そーいうことですか。わかりました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました