こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

変数の内容がコロコロ変わる、原因を教えてください。

VC++2010でプログラムしていますが、下記変数TESTの内容がプログラム実行中にある時点で勝手に変更されてしまいます。もちろんプログラム中に変数TESTを変更する記述は何処にも書いていません。
64bit環境での変数設定の注意点を教えてください。


long TEST=0;
long TEST1;
char LOOP=1;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
while(LOOP)
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );//翻訳する
DispatchMessage( &msg );//急送する
}

TEST1 = 7777777;

if(TEST)Beep(3000,100);

}//while(LOOP)

return msg.wParam;
}//WinMain

投稿日時 - 2011-05-04 16:09:36

QNo.6713560

すぐに回答ほしいです

質問者が選んだベストアンサー

>コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。

その難しいことが起きるから発見されないんですけどね。
世の中の製品のゲームやアプリでも偶然動いていることは良く有ります。
コンパイラが変わるとコンパイラの最適化アルゴリズムが変わるので変数のメモリの配置やコンパイル後の機械語命令コードの並びそのものが完全に変わるのはよく有る出来事です。そのため前のコンパイラでは問題なかったプログラムがいきなりバグだらけのプログラムに変わることがあります。

>ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。

Releaseビルドした上で開発マシンでバグが出なかった場合は、操作方法や稼働負荷で出るバグでない限りバグが表面化する可能性は限りなく低いと思います。
つまり、他のPCやバージョンの違うOSで動く可能性はかなり高いです。と言ってもOSがWin98からWinXPに変わったときにバグが表面化したソフトも実際にかなり有りましたけどね。

投稿日時 - 2011-05-05 22:10:22

お礼

よくわかりました。
デバグ開始でバグ発見に努めます。
色々とありがとうございました。

投稿日時 - 2011-05-05 22:41:09

ANo.6

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

zwi

それはバグが表面化しただけでバグが潜んでいた可能性が高いです。コンパイラが変わったので問題が表面化しています。つまりバグを直さないと動きません。x86とかx64とか無関係です。
バグを直したくないというなら、素直にVC++6でコンパイルした実行ファイルのまま使ったほうが良いでしょう。

投稿日時 - 2011-05-05 18:57:18

補足

zwiさん、度々ありがとうございます。
コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。
やはり、原点に返って変数(配列)領域のアクセスを洗ってみます。
ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。

投稿日時 - 2011-05-05 21:43:57

ANo.4

zwi

配列の添字間違いか、ポインタ操作のミスなど考えられる原因は沢山あります。
64bitか32bitかとか全く無関係でしょうね。
デバッガのデータ変更ブレークの方法を理解したほうが懸命です。

投稿日時 - 2011-05-05 18:16:02

補足

毎回ありがとうございます。
実は最初に大事な事を書くのを忘れていました。

VC++6でプログラムしたソースをVC++2010(Win7,64bit)にそのまま移行しました。
移行後にソースは絶対に変更していません。
VC++6時代ではエラーなく実行されていたのですが、64bit環境になってからのエラーになります。
今回の事態になってからプログラムをやり直す考えは全くありません。

2010の64bitコンパイラで完全な32bit環境でコンパイルできる設定が知りたいのです、コンパイルオプションやリンカーオプションの設定を教えてください。
よろしくお願いします。

投稿日時 - 2011-05-05 18:46:49

ANo.3

提示されているコード中で怪しい部分は特になさそうです。

VCを使っているのであれば、TESTにデータブレークポイントを設定してどこで値が変化しているのか確認するのが良いのではないでしょうか。

ちなみに良くあるミスとしては

int a[2] = {0,0};
int b = 0;
a[2] = 123; // これでbの値が変わることがある

のように、変数の範囲外アクセスが原因で他の変数の値が変わってしまうことがあります。

あと、
>64bit環境での変数設定の注意点を教えてください。
これの意味が良く分からないのですが、これは32ビットでビルドすると問題ないということでしょうか?

投稿日時 - 2011-05-05 17:23:39

補足

qwertfkさん

回答ありがとうございます、実は最初に書き忘れていたのですが、VC++6のソースをそのままVC++2010に移行しただけです。

もちろん、VC++6では問題なく動作していました。

よろしくお願いします。

投稿日時 - 2011-05-05 18:52:21

ANo.2

「プログラム実行中にある時点で勝手に変更されてしまいます」といっても, 当然「プログラムがそうなってるからそう動作する」だけだよね.

とりあえず「どこで『勝手に変更』されているのか」を調べたら?

投稿日時 - 2011-05-05 15:34:07

補足

毎度、回答ありがとうございます。
質問のプログラムは実際のプログラムではありませんが、仮にこのようなプログラムがあったとしたら、ある時点で勝手にベープ音が鳴ると言う状況で、何処で鳴るかは現実問題として特定出来ない状況です。
実際に変数を変更するプログラムを書いていないに関わらず勝手に変更されてしまいます。
更に、付け加えさせて頂きますと、設定した配列変数の1番目の変数が実行中に何時までたってもゼロのままで変化しないため2番目の配列を使用すると変更されていることが確認されました。

まるで、狐に包まれたような変な状況です。
ただ、プログラムが膨大で全体を提示出来ないのが残念です。

よろしくお願いします。

投稿日時 - 2011-05-05 17:16:40

ANo.1

zwi

ところでmsgの定義がないけど間違ってない?
これが、いちばんあやしい。

投稿日時 - 2011-05-05 11:23:35

補足

MSG msg;の記述ですが、下記の通り設定しています。
今回質問に記述したコードは質問のための1例です。
実際には変数や配列変数は何千と設定しています。
よろしくお願いします。

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;


投稿日時 - 2011-05-05 14:19:37