引数の値が変わる – プログラミング – Home

通知
すべてクリア

[解決済] 引数の値が変わる


きくじろう
 きくじろう
(@きくじろう)
ゲスト
結合: 17年前
投稿: 16
Topic starter  

VC++2005 XP_Pro64bit

ある関数の引数に構造体を設定して値渡しにして
デバッグで☆の所で確認するとrect2の値がrectと違います。
そのまま1行送るとrect3にはrectと同じ値が正しく設定されるのです。
関係あるのかどうかも解りませんが今回初めて64bitのプログラムで
何かの設定が悪いのか正常な動作なのか
rect2の値が変わる原因が解らず困っています
何か情報ありましたらお願いします

手順は次の通りです

ダイアログベースでプロジェクトを新規作成
以下の関数を追加
void CDlg::OnBnClickedButton1()
{
RECT rect;
rect.top=10;
rect.bottom=20;
rect.left=30;
rect.right=40;
Test(rect);
}

void CDlg::Test(RECT rect2)
{
RECT rect3;
☆ rect3=rect2;
}
64bitでビルド


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

停止した時点ではその行は実行されてないから(rect2も未評価)じゃなくて?
気になるなら TRACE でも仕掛けりゃいいじゃない。


返信引用
きくじろう
 きくじろう
(@きくじろう)
ゲスト
結合: 17年前
投稿: 16
Topic starter  

早速の返信ありがとうございます
TRACE入れてみました

void C***Dlg::Test(RECT rect2)
{
RECT rect3;
TRACE(top=%d\n,rect2.top);
TRACE(bottom=%d\n,rect2.bottom);
TRACE(left=%d\n,rect2.left);
TRACE(right=%d\n,rect2.right);
☆ rect3=rect2;
}

結果は以下のようにウォッチではおかしな値ですが
TRACEには正常値が出力されました
デバッガの表示がおかしいだけのようですね?

ウォッチデータ
rect2 {top=0 bottom=-858993460 left=1239856 right=-858993460}
rect3 {top=10 bottom=20 left=30 right=40}

TRACEの出力データ
top=10
bottom=20
left=30
right=40


返信引用
Jason
 Jason
(@Jason)
ゲスト
結合: 16年前
投稿: 26
 

ウォッチデータで
rect2の確認時点を教えてください。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

なんか、大昔に似たような目にあったような。
そんときは、コンパイラが16bit->32bitに移行する時期で
たしか、スタックの評価が間違っていた。
コンパイラがアップグレードしたらよくなったけど、
詳しいバージョンは忘れた。
ひょっとすると、同じ事が起こっているかも知れません。

て、ことで、役に立たないスレですみません(vv;)。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

もう、すでにやってるかもしれませんが
VCを一度落とし、中間ファイルを全部消してみて
完全にリビルドしなおしてみてはどうでしょうか?


返信引用
きくじろう
 きくじろう
(@きくじろう)
ゲスト
結合: 17年前
投稿: 16
Topic starter  

Jason様、仲澤@失業者様、rin様
返信ありがとうございます

rect2の確認時点は☆の2箇所です
Test()のスコープ内でずっと同じ値でした

void C***Dlg::Test(RECT rect2)
{
RECT rect3;
TRACE(top=%d\n,rect2.top);
TRACE(bottom=%d\n,rect2.bottom);
TRACE(left=%d\n,rect2.left);
TRACE(right=%d\n,rect2.right);
☆ rect3=rect2;
☆}

中間ファイルも消したと思いますがもう一度トライしてみます
プログラムの動作は問題ない雰囲気ですが
デバッグの際に不便だし気持ち悪いですね


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーーん、 
 VC++2005って64BIT OSに完全対応してましたっけ?
コンパイル等できてるだけで、マイクロソフトが保障してなかったような?
対応していればいいのですが、疑問です。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

ぐぐってみると、VC++2005でマイクロソフトが保障しているのは
FrameWork 2.0以降のみいたいですね。
変数の説明もあるので、C/C++のみならいけそうです。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

修正です
FrameWork 2.0以降のみいたいですね。

      ↓

FrameWork 2.0以降みたいですね。


返信引用
きくじろう
 きくじろう
(@きくじろう)
ゲスト
結合: 17年前
投稿: 16
Topic starter  

ITO様、情報ありがとうございます
上記プログラムはMFCアプリケーションで作ってます。
VS2005SP1とFrameWork2.0SP2をインストールしてみましたが
現状変わらずです。
MicrosoftのHP彷徨ってみます


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> VS2005SP1とFrameWork2.0SP2をインストールしてみましたが
> 現状変わらずです。
「MFCでなく、FrameWork2.0以降を使用した場合のみ保障している」
 ということです。

参考サイト
http://msdn.microsoft.com/ja-jp/library/ms241064(VS.80).aspx


返信引用
きくじろう
 きくじろう
(@きくじろう)
ゲスト
結合: 17年前
投稿: 16
Topic starter  

ITO様ありがとうございます

MFCについて記述されていないってことは
保証外ってことなんですね
それで動作的には一応動いてそうだけど
引数のウォッチがおかしくなったり
他にも何かあるかもしれないんですねぇ

MFCは64bit出来ないよって記述に行き当たるまで
さまよってしまいそうですがあきらめます
MFCは置いていかれるのかなー(涙

皆様ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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