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
No.6ベストアンサー
- 回答日時:
>コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。
その難しいことが起きるから発見されないんですけどね。
世の中の製品のゲームやアプリでも偶然動いていることは良く有ります。
コンパイラが変わるとコンパイラの最適化アルゴリズムが変わるので変数のメモリの配置やコンパイル後の機械語命令コードの並びそのものが完全に変わるのはよく有る出来事です。そのため前のコンパイラでは問題なかったプログラムがいきなりバグだらけのプログラムに変わることがあります。
>ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。
Releaseビルドした上で開発マシンでバグが出なかった場合は、操作方法や稼働負荷で出るバグでない限りバグが表面化する可能性は限りなく低いと思います。
つまり、他のPCやバージョンの違うOSで動く可能性はかなり高いです。と言ってもOSがWin98からWinXPに変わったときにバグが表面化したソフトも実際にかなり有りましたけどね。
No.5
- 回答日時:
それはバグが表面化しただけでバグが潜んでいた可能性が高いです。
コンパイラが変わったので問題が表面化しています。つまりバグを直さないと動きません。x86とかx64とか無関係です。バグを直したくないというなら、素直にVC++6でコンパイルした実行ファイルのまま使ったほうが良いでしょう。
この回答への補足
zwiさん、度々ありがとうございます。
コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。
やはり、原点に返って変数(配列)領域のアクセスを洗ってみます。
ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。
No.4
- 回答日時:
配列の添字間違いか、ポインタ操作のミスなど考えられる原因は沢山あります。
64bitか32bitかとか全く無関係でしょうね。
デバッガのデータ変更ブレークの方法を理解したほうが懸命です。
この回答への補足
毎回ありがとうございます。
実は最初に大事な事を書くのを忘れていました。
VC++6でプログラムしたソースをVC++2010(Win7,64bit)にそのまま移行しました。
移行後にソースは絶対に変更していません。
VC++6時代ではエラーなく実行されていたのですが、64bit環境になってからのエラーになります。
今回の事態になってからプログラムをやり直す考えは全くありません。
2010の64bitコンパイラで完全な32bit環境でコンパイルできる設定が知りたいのです、コンパイルオプションやリンカーオプションの設定を教えてください。
よろしくお願いします。
No.3
- 回答日時:
提示されているコード中で怪しい部分は特になさそうです。
VCを使っているのであれば、TESTにデータブレークポイントを設定してどこで値が変化しているのか確認するのが良いのではないでしょうか。
ちなみに良くあるミスとしては
int a[2] = {0,0};
int b = 0;
a[2] = 123; // これでbの値が変わることがある
のように、変数の範囲外アクセスが原因で他の変数の値が変わってしまうことがあります。
あと、
>64bit環境での変数設定の注意点を教えてください。
これの意味が良く分からないのですが、これは32ビットでビルドすると問題ないということでしょうか?
この回答への補足
qwertfkさん
回答ありがとうございます、実は最初に書き忘れていたのですが、VC++6のソースをそのままVC++2010に移行しただけです。
もちろん、VC++6では問題なく動作していました。
よろしくお願いします。
No.2
- 回答日時:
「プログラム実行中にある時点で勝手に変更されてしまいます」といっても, 当然「プログラムがそうなってるからそう動作する」だけだよね.
とりあえず「どこで『勝手に変更』されているのか」を調べたら?
この回答への補足
毎度、回答ありがとうございます。
質問のプログラムは実際のプログラムではありませんが、仮にこのようなプログラムがあったとしたら、ある時点で勝手にベープ音が鳴ると言う状況で、何処で鳴るかは現実問題として特定出来ない状況です。
実際に変数を変更するプログラムを書いていないに関わらず勝手に変更されてしまいます。
更に、付け加えさせて頂きますと、設定した配列変数の1番目の変数が実行中に何時までたってもゼロのままで変化しないため2番目の配列を使用すると変更されていることが確認されました。
まるで、狐に包まれたような変な状況です。
ただ、プログラムが膨大で全体を提示出来ないのが残念です。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
誕生日にもらった意外なもの
みなさんがもらった誕生日プレゼントで面白いものがあったらぜひ教えてください!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
変数の値が勝手に変化する原因
C言語・C++・C#
-
値が変わるのはどうしてでしょうか?
C言語・C++・C#
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
COBOLの論理演算子について質問...
-
リリースモードとデバッグモー...
-
unsigned long long 型のフォー...
-
組み込みソフト。ROM領域にデータ
-
printfなど、標準関数のソース...
-
C++Builder → Visual C++ 移植...
-
パーサとコンパイラの違いって?
-
未使用引数の注意文出力を回避...
-
#pragma プリプロセス について
-
C言語 キーワードとは??
-
.EXEから製作者を特定すること...
-
VisualC++6.0でのProfessionalE...
-
C言語でチェスを作ってみたいと...
-
g++でのユニコード文字列使用
-
C言語の規格
-
Type name expected エラーがで...
-
C言語 main関数とsum関数の記...
-
STATICのスクロールバー...
-
プログラマーに向いている人の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++Builder → Visual C++ 移植...
-
COBOLのALPHABET...
-
printfなど、標準関数のソース...
-
パーサとコンパイラの違いって?
-
cc と gcc の違い
-
組み込みソフト。ROM領域にデータ
-
リリースモードとデバッグモー...
-
変数の内容がコロコロ変わる、...
-
PICでのI2C通信でのマスタ、ス...
-
C++でデスクトップGUIアプリ開...
-
組込みC開発
-
プログラマーに向いている人の...
-
最初に使う変数のゼロクリアに...
-
未使用引数の注意文出力を回避...
-
main() 関数は、int を返値とす...
-
COBOLの論理演算子について質問...
-
cudaのnvccはmingwやgccでも使...
-
オープン系とか、組込み系とか...
おすすめ情報