変数の中身がおかしい
変数の中身がおかしい
いつもお世話になっています。
ちょっとしたソフトを作っているのですが
おかしな現象が起きています。
i=0;と代入したのにi=260;となってたり
i=sとしてiとsの値が違っていたりと何かが起きているのですが、
どうすればいいでしょうか?私自身もこういうことは初めてで困っています。
VC++2008EE Vistaです。よろしくお願いします。
ちょっとしたソフトを作っているのですが
おかしな現象が起きています。
i=0;と代入したのにi=260;となってたり
i=sとしてiとsの値が違っていたりと何かが起きているのですが、
どうすればいいでしょうか?私自身もこういうことは初めてで困っています。
VC++2008EE Vistaです。よろしくお願いします。
Re:変数の中身がおかしい
ぽこさん、クリーンしてリビルドしてみましたが、できませんでした。
Justyさんコンパイラの最適化はオフですか?
>>プロジェクトのリンカの最適化はすべて既定値となっています。
一回再インストールしてみます。
Justyさんコンパイラの最適化はオフですか?
>>プロジェクトのリンカの最適化はすべて既定値となっています。
一回再インストールしてみます。
Re:変数の中身がおかしい
>リンカの最適化
どの設定を見ていますか?
コンパイラ(構成プロパティ → C/C++ → 最適化)の方です。
判らなければ、今構成は Debug/Releaseどっちになっていますか?
>リビルドしてみましたが、できませんでした。
リビルド出来なかった、ということですか?
リビルドに失敗しているとなるとソースと実行ファイル・デバッグ情報に食い違いが発生している
可能性が高いです。
再インストールの前に、VisualC++を一旦全て終了し、ビルドの成果物(設定が標準なら
Debug/Releaseフォルダ)や ncbファイルを消して、プロジェクトを立ち上げて再度試してみてください。
ファイル・フォルダが消せないようであれば、OSを再起動してから試して下さい。
どの設定を見ていますか?
コンパイラ(構成プロパティ → C/C++ → 最適化)の方です。
判らなければ、今構成は Debug/Releaseどっちになっていますか?
>リビルドしてみましたが、できませんでした。
リビルド出来なかった、ということですか?
リビルドに失敗しているとなるとソースと実行ファイル・デバッグ情報に食い違いが発生している
可能性が高いです。
再インストールの前に、VisualC++を一旦全て終了し、ビルドの成果物(設定が標準なら
Debug/Releaseフォルダ)や ncbファイルを消して、プロジェクトを立ち上げて再度試してみてください。
ファイル・フォルダが消せないようであれば、OSを再起動してから試して下さい。
Re:変数の中身がおかしい
メタさん、グローバル変数がどうしたのでしょうか・・・。
Justyさん
>>もう再インストールしてしまいました。
>>けれど、今でもおかしな値になります。
リビルドしてみましたが、できませんでした。
>>すみません、言葉が足りませんでした。リビルドしてからもおかしな値が出たということです。
最適化は無効となっています。
今、これはと思うことがありました。
for(int i=0;i<MAX_PATH;i++)
fileName=num;
問題のソースの前にこういう文があって問題の変数iの定義へ移動をしたら上のfor文のiを指したということは
原因かもしれないと思ったのですが、これが原因の場合どうすればいいでしょうか?
Justyさん
>>もう再インストールしてしまいました。
>>けれど、今でもおかしな値になります。
リビルドしてみましたが、できませんでした。
>>すみません、言葉が足りませんでした。リビルドしてからもおかしな値が出たということです。
最適化は無効となっています。
今、これはと思うことがありました。
for(int i=0;i<MAX_PATH;i++)
fileName=num;
問題のソースの前にこういう文があって問題の変数iの定義へ移動をしたら上のfor文のiを指したということは
原因かもしれないと思ったのですが、これが原因の場合どうすればいいでしょうか?
Re:変数の中身がおかしい
>今変数名を変えて試してみましたら、代入できました。
多分ウインドウ上の値がおかしかっただけで、元々できていたと思いますよ。
基本的にデバッガの値は「デバッガが認識している値」を表示しているだけで、
本当にその変数にその値が入っているかどうかまた別の話ですから。
>これはコンパイラのせいなのでしょうか?
どちらかというとコーディングスタイルとデバッガの見方に問題があります。
for文の中と外で同じ変数名(しかも短い)を宣言するというスタイルは言語的には問題ないですが、
お行儀がいいとはちょっと言えません。
for文の中は iでいいとしても、外の方は何か適切な名前をつけた方がいいですね。
次に見ているウインドウは多分「自動変数」ウインドウだと思いますが、
こちらは同じ関数内に同じ変数名が複数あるとウインドウ内の変数名の参照先がプログラムの実行に合わせて
変化してしまいます。
そういう場合は「ローカル」ウインドウの方で確認して見て下さい。
こちらを使うと、関数内で使われている全てのローカル変数がリストアップされます。
多分ウインドウ上の値がおかしかっただけで、元々できていたと思いますよ。
基本的にデバッガの値は「デバッガが認識している値」を表示しているだけで、
本当にその変数にその値が入っているかどうかまた別の話ですから。
>これはコンパイラのせいなのでしょうか?
どちらかというとコーディングスタイルとデバッガの見方に問題があります。
for文の中と外で同じ変数名(しかも短い)を宣言するというスタイルは言語的には問題ないですが、
お行儀がいいとはちょっと言えません。
for文の中は iでいいとしても、外の方は何か適切な名前をつけた方がいいですね。
次に見ているウインドウは多分「自動変数」ウインドウだと思いますが、
こちらは同じ関数内に同じ変数名が複数あるとウインドウ内の変数名の参照先がプログラムの実行に合わせて
変化してしまいます。
そういう場合は「ローカル」ウインドウの方で確認して見て下さい。
こちらを使うと、関数内で使われている全てのローカル変数がリストアップされます。

Re:変数の中身がおかしい
コーディングスタイルとデバッガの見方に問題があったのですか。
for文で使い回しをしようと思ったらこのようなコーディングになってしまいました。
これからは気をつけようと思います。
ローカルのウィンドウで確認してみましたがちゃんとi=0がありました。
皆様のおかげで解決できました。
ぽこさん、Justyさん、メタさんありがとうございました。
for文で使い回しをしようと思ったらこのようなコーディングになってしまいました。
これからは気をつけようと思います。
ローカルのウィンドウで確認してみましたがちゃんとi=0がありました。
皆様のおかげで解決できました。
ぽこさん、Justyさん、メタさんありがとうございました。
Re:変数の中身がおかしい
一言付け加えるならリリースビルドでデバッグすると変数はまともな値を示しませので必ずデバッグビルドでデバッグしてください。リリスービルドの最適化されたものの動作がデバッガで追跡し切れないために起こる現象です。
Re:変数の中身がおかしい
softyaさん補足ありがとうございます。
つまり、リリースビルドではデバッグをしないほうがいいということですね。
今回、変数が代入できない現象はデバッグビルドで起きました。
デバッガの使い方が悪かったのが原因でした。
つまり、リリースビルドではデバッグをしないほうがいいということですね。
今回、変数が代入できない現象はデバッグビルドで起きました。
デバッガの使い方が悪かったのが原因でした。
Re:変数の中身がおかしい
> つまり、リリースビルドではデバッグをしないほうがいいということですね。
デバッグ用のビルドとリリース用のビルドですので、当然そうなります。
しかし、リリース用のビルドの時にしか発生しないバグもありますので、
その場合は何らかの方法でリリースビルドでビルドした
プログラムをデバッグする必要があります。
デバッグビルドで発生するバグを全てつぶしてからの話ですけど。
デバッグ用のビルドとリリース用のビルドですので、当然そうなります。
しかし、リリース用のビルドの時にしか発生しないバグもありますので、
その場合は何らかの方法でリリースビルドでビルドした
プログラムをデバッグする必要があります。
デバッグビルドで発生するバグを全てつぶしてからの話ですけど。