トップ回答者
ウオッチ式のエラー表示

質問
-
初歩的な質問かもしれませんが、
なぜなのかわからないので、教えてください。以下のようにコードを書き実行したところ、
メッセージボックスには「かきくけこ」と表示され、変数CS_tmpに値が入っているのですが、
ウォッチ式に追加してデバッグをおこなうと
CXX0017エラーです:シンボル"CS_tmp"が見つかりません」と表示されてしまいます。
デバッグ実行で値を見る方法は無いのでしょうか?
それとも、この代入は間違ってるのでしょうか?// TODO: アプリケーションの動作を記述するコードをここに挿入してください。
TCHAR* TC_tmp[2];
TC_tmp[0] = _T("あいうえお");
TC_tmp[1] = _T("かきくけこ");
TCHAR* CS_tmp = TC_tmp[1];
MessageBox(NULL,CS_tmp,"代入テスト",NULL);
回答
-
これは、「最適化されたために MessageBox に引き渡している CS_tmp が TC_tmp[1] に置き換わった」とおっしゃってますか?その通りですね。Release でのデバッグで変数が省略されてた経験でそれかなと・・。速度最適化オプション指定では、
メモリ格納が不要な変数はかなり VSデバッガ で値はみれなかったです。同じように、最適化されて使われていない変数が削除されたと考えたのですが、「MessageBox で使われ ているので違うな~」と考えました。最近の最適化ルーチンは、一回しか行われていない直前の代入を削除する、なんてことまでやってくれるのでしょうか。VS2010 Pro SP1 での話ですが、
VSの逆アセンブラ表示で確認してみた限り不要な代入はかなり削除されてましたよ。
このコードのみの条件ならば、
MessageBox で参照していても CS_tmp は不要ですよね?TCHAR* TC_tmp[2]; TC_tmp[0] = _T("あいうえお"); TC_tmp[1] = _T("かきくけこ"); TCHAR* CS_tmp = TC_tmp[1]; ::MessageBox(NULL,CS_tmp, L"代入テスト",NULL); push 0 push offset string L"\x4ee3\x5165\x30c6\x30b9\x30c8" push offset string L"\x304b\x304d\x304f\x3051\x3053" push 0 call dword ptr [__imp__MessageBoxW@16 (8C20F4h)]
興味がわいたので例示コードを最適化オプションつけて逆アセンブル表示を見てみましたが以上のように全変数が省略されてますね。Jitta さんの言われるようにブレークポイントで停止させる場所が悪いような気がしてきましたが、ついでにデバッグモードで代入式のところで停止させて試しましたが宣言がスコープ内のためか表示できますね・・・。
すべての返信
-
単純に最適化オプションが /Od になっていないと思われますが、
ソリューションの構成が Release なのではないですか?
これは、「最適化されたために MessageBox に引き渡している CS_tmp が TC_tmp[1] に置き換わった」とおっしゃってますか?
同じように、最適化されて使われていない変数が削除されたと考えたのですが、「MessageBox で使われているので違うな~」と考えました。最近の最適化ルーチンは、一回しか行われていない直前の代入を削除する、なんてことまでやってくれるのでしょうか。それよりも、確認を CS_tmp の宣言よりも前の行で行っているのではないか?と考えるのですが、いかがでしょう?
Jitta@わんくま同盟- 回答の候補に設定 山本春海 2011年11月10日 8:56
-
これは、「最適化されたために MessageBox に引き渡している CS_tmp が TC_tmp[1] に置き換わった」とおっしゃってますか?その通りですね。Release でのデバッグで変数が省略されてた経験でそれかなと・・。速度最適化オプション指定では、
メモリ格納が不要な変数はかなり VSデバッガ で値はみれなかったです。同じように、最適化されて使われていない変数が削除されたと考えたのですが、「MessageBox で使われ ているので違うな~」と考えました。最近の最適化ルーチンは、一回しか行われていない直前の代入を削除する、なんてことまでやってくれるのでしょうか。VS2010 Pro SP1 での話ですが、
VSの逆アセンブラ表示で確認してみた限り不要な代入はかなり削除されてましたよ。
このコードのみの条件ならば、
MessageBox で参照していても CS_tmp は不要ですよね?TCHAR* TC_tmp[2]; TC_tmp[0] = _T("あいうえお"); TC_tmp[1] = _T("かきくけこ"); TCHAR* CS_tmp = TC_tmp[1]; ::MessageBox(NULL,CS_tmp, L"代入テスト",NULL); push 0 push offset string L"\x4ee3\x5165\x30c6\x30b9\x30c8" push offset string L"\x304b\x304d\x304f\x3051\x3053" push 0 call dword ptr [__imp__MessageBoxW@16 (8C20F4h)]
興味がわいたので例示コードを最適化オプションつけて逆アセンブル表示を見てみましたが以上のように全変数が省略されてますね。Jitta さんの言われるようにブレークポイントで停止させる場所が悪いような気がしてきましたが、ついでにデバッグモードで代入式のところで停止させて試しましたが宣言がスコープ内のためか表示できますね・・・。 -
こんにちは、浦健一 さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
しばらく経ちましたが、みなさんからの投稿は確認されましたか?
参考になる情報をいただいていると思われましたので、勝手ながら私のほうで回答としてマークさせていただきました。
情報くださったみなさん、アドバイスありがとうございます。
いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。
今後、同じ問題でこのスレッドを参照される方にも、有効な情報を活用いただけるかと思いますので、ご協力よろしくお願いいたしますね。
今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海