Debug実行とRelease実行

[戻る]
ねこ 2005/01/07(金) 09:42:32
VCでの動作確認には

@DebugビルドでVC実行ボタンで実行
ADebugビルドでexeファイルで実行
BReleaseビルドでVC実行ボタンで実行
CReleaseビルドでexeファイルで実行

の4種類があると思うのですが、この中でCの場合だけ出る不具合があります。

具体的にはダイアログ上のActiveXコントロールの表示がおかしくなります。
(縦横サイズが0になる)

このような場合、どういう原因を考えればいいのでしょうか?
デバッグ方法、注意すべきポイントなど何でもいいので
アドバイスお願いします。

環境は Win2000/VC.NET/MFC です。

PATIO 2005/01/07(金) 10:31:08
exeファイルで実行と言うのがよくわからないのですけれど、
エクスプローラーでダブルクリックでもするって事でしょうか?
1、3と2、4は実行時のカレントディレクトリが違うのですが、
これは認識されているでしょうか?
何か必要なファイルが、DebugフォルダにはあってReleaseフォルダにはないとか
ないでしょうか。
書き込まれている内容からはこれくらいしか想像できないです。

あと、丸付き数字は機種依存文字なのでネットワークでは使わないほうがいいです。
Macの人とかは読めませんので。

PATIO 2005/01/07(金) 10:32:15
> 1、3と2、4は実行時のカレントディレクトリが違う

これはエクスプローラーでダブルクリックで起動した時を想定しています。

MASATO [E-Mail] [HomePage] 2005/01/07(金) 10:44:20
初期化するべき変数を初期化していない可能性があります。
初期化していない変数を使っていないかチェックしてみて下さい。

例えばこんな感じのコードはないでしょうか。
int x;
if (x < 0) {
    // 色々処理
}else {
    // 色々処理
};

初期化されていない変数の値は未定義です。
@ABCでそれぞれ異なる値が設定される可能性があります。
(@Aではデバッグ用の値(0xcdcdcdcd...)になる場合が多いようです。)

初期化されてない変数が負の場合は正しく動作し、正の場合はうまく動作しないようなプ
ログラムになっていたりすると、Cだけうまく動作しないということがありえます。

ねこ 2005/01/07(金) 11:57:02
PATIOさんMASATOさん レスありがとうございます。

>>あと、丸付き数字は機種依存文字なのでネットワークでは使わないほうがいいです。
>>Macの人とかは読めませんので。

>@DebugビルドでVC実行ボタンで実行
>ADebugビルドでexeファイルで実行
>BReleaseビルドでVC実行ボタンで実行
>CReleaseビルドでexeファイルで実行

すいません。以下に修正します。

1.DebugビルドでVC実行ボタンで実行
2.Debugビルドでexeファイルで実行
3.ReleaseビルドでVC実行ボタンで実行
4.Releaseビルドでexeファイルで実行

>exeファイルで実行と言うのがよくわからないのですけれど、
>エクスプローラーでダブルクリックでもするって事でしょうか?

はい。そのとおりです。

>初期化するべき変数を初期化していない可能性があります。
>初期化していない変数を使っていないかチェックしてみて下さい。

1,2と3,4で動作が違うなら初期化を疑うのですが、1,2,3と4で動作が
違うので困っています。
けれど初期化ももう一度チェックしてみます。

>1、3と2、4は実行時のカレントディレクトリが違うのですが、
>これは認識されているでしょうか?
>何か必要なファイルが、DebugフォルダにはあってReleaseフォルダにはないとか
>ないでしょうか。

カレントディレクトリの違いは認識しています。
試しに4.のexeファイルをVCプロジェクトファイルと同じDirに置いて
実行してみたのですが、やはり表示がおかしくなりました。

>書き込まれている内容からはこれくらいしか想像できないです。

あと、メイン画面から二枚ダイアログを表示させているのですが(モーダレス)
一枚目の表示がおかしくなり、二枚目は正常な表示になります。
さらに再表示させると二枚とも正常な表示になります。

このあたりが何かポイントになるのでしょうか?

REE 2005/01/07(金) 14:48:07
>あと、メイン画面から二枚ダイアログを表示させているのですが(モーダレス)
>一枚目の表示がおかしくなり、二枚目は正常な表示になります。
>さらに再表示させると二枚とも正常な表示になります。
>
>このあたりが何かポイントになるのでしょうか?

であるならば、MASATOさんご指摘の内容が有力です。

J 2005/01/12(水) 09:35:49
全体を覆っているようなタブコントロールの様なコントロールがある場合
そのコントロールの後ろに描画されるのが原因かもしれませんね。

描画順を確定させるために一番後ろに描画させたいコントロール(タブコントロールなど)
のZオーダーを変更してみてはどうでしょう。

OnPaint 内で
{
CTabCtrl* ptab = static_cast<CTabCtrl*>(GetDlgItem(IDC_HOGEHOGETAB));

ptab->SetWindowPos(&ChogehogeDlg::wndBottom, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
}

ねこ 2005/01/13(木) 18:18:53
REE様、J様、レスありがとうございます。

>J様
タブコントロールは使っていません。
しかし(もし使用していたら)そのようなパターンは充分考えられますので
今後の参考にしたいと思います。ありがとうございました。

原因はMASATO様、REE様のご指摘通り、初期化でした。
ShowWindow時に各コントロールのサイズを調整しているのですが、その時に
使用している変数の値が不定だったため、コントロールサイズがマイナスに
なり上記の現象が起こっていたようです。

コンストラクタで変数の初期化を行うことで解決しました。

ただ少し気になるのが、上記の3.(実行ボタンで実行)と4.(exeファイルで実行)
で挙動が違う点です。
初期化を行わない場合、変数に入っている値が3.と4.で違ったのですが(正数と負数でした)
これは「不定」ということで何が入るかわからないからでしょうか?

それとも普通は初期化されない変数は3.と4.で同じ値が入るものなのでしょうか?

後学のためこのあたりをきちんと理解したいのですが、
どなたか解説をお願いできないでしょうか?
もしくはその事について説明しているサイトのURLなどを教えていただけると
幸いです。

ねこ 2005/01/13(木) 18:21:21
[[解決]]
申し訳ありません。
下記についてはMASATO様から既に説明いただいてました。

>初期化を行わない場合、変数に入っている値が3.と4.で違ったのですが(正数と負数でした)
>これは「不定」ということで何が入るかわからないからでしょうか?

>それとも普通は初期化されない変数は3.と4.で同じ値が入るものなのでしょうか?

古いスレッドには追加発言できません。