現在、VC++.NET2002で
Sample1の画面上のボタンを押すと
Sample2の画面上に画像を表示する内容の
アプリケーションを作成しております。
2つのクラス間の引数の受け渡しのために
以下の様なプログラムコードを作成しました。
ビルド実行は通るのですが、
デバッグしSample1の画面上のボタンを
押しますと「Debug Assertion Failed!」と
表示されます。
自分なりに調べたのですが、原因がわかりません。
_______________________________________________
7/26(火)に上記の質問をさせて頂き、
返答して下さった方々のおかげで、
エラーの原因について理解する事が出来ました。
あれから自分なりに修正を行なっていたのですが
上手くいきません。
具体的にどの様に修正したらよろしいのでしょうか。
本当に勉強不足で申し訳ありません。
宜しくお願いします。
//クラスSample1のプログラムコード
void Sample1::OnBnClickedButton1()
{
go(botton1);
}
void Sample1::go(int number)
{
//引数の受け渡し
Sample2 S2;
S2.display(number);
EndDialog(0);
hime.DoModal();
}
//クラスSample2のプログラムコード
void Sample2::OnPaint()
{
if (IsIconic())
{
省略
}
else
{
CDialog::OnPaint();
if(dispflg) {
CDC* pDC=this->GetDC();
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP);
myDC.CreateCompatibleDC(pDC);
CBitmap* oldBMP=myDC.SelectObject(&myBMP);
pDC->BitBlt(5,25,256,256,&myDC,0,0,SRCCOPY);
myDC.SelectObject(oldBMP);
}
}
}
void Sample2::display(int number)
{
getnumber=number;
//画像の表示
if(getnumber==1){
dispflg=1;
Invalidate();
}
else{
EndDialog(0);
}
}
button1はマクロ定義で
#define button1 1
と定義してあります。
画像はリソースとして設定して
おいた画像を表示します。
「Debug Assertion Failed!」が何処で出ているのか調べましたか?
これはデバッグする上でとても有益な情報なんですけれど。
多分、そうだろうという話で書きますが、
Sample2 S2;ってインスタンスを作成しているだけですよね。
これに対してS2.display(number);を呼んでしまっていますが、
この時点でSample2というダイアログは表示されていますか?
表示されていないダイアログに対して操作を行おうとして
いませんか?
同じ指摘を以前のスレッドでも受けていたと思いますが、
本当に指摘されている内容を理解してるでしょうか?
どうも書き込みの内容を見る限りでは理解できていないように感じますけれど。
Sample2 S2 = new Sample2( NULL );
S2.Create( ダイアログID, this );
S2.ShowWindow( SW_SHOW );
S2.display(number);
PATIOさんのご指摘や、前回のスレッドを見ていると、
上記のような気がします、、、
デバッグで1行づつ進めていき、「Debug Assertion Failed!」が
発生した場所が分かれば、そこが怪しいなと見当が付きます。
発生箇所が分かれば、原因特定もしやすいですよね。
> あれから自分なりに修正を行なっていたのですが
# 前回のソースと変わらないように見えるのは、きっと私の気のせい。。。
# イチャモンに近いですが、display() に3つの機能?
# (変数更新、画面更新、ダイアログ終了)を持たせているようなので、
# それぞれ、バラバラにしてはいかがでしょうか?
# なるべく 1関数1機能 としたほうが、ソース見返すとき理解しやすくありません?
> あれから自分なりに修正を行なっていたのですが
> 上手くいきません。
どんな修正をかけ、その結果どのように「うまくいかない」のですか?
まぁ、あせらず、
S2.display(number);
の行を削除して実行し、結果を報告すれば原因だけは確定するだろう。
「Debug Assertion Failed!」
のあとにソース名「XXXXX.C」もしくは、「XXXX.INI」
と行番号が表示されていると思うのですがどうですか。
それがわかるとだいぶ話が進みそうだとおもうのですが、
ソースを見る限りでは、
>void Sample1::go(int number)
>{
> //引数の受け渡し
> Sample2 S2;
> S2.display(number); ←
> EndDialog(0);
> hime.DoModal();
>}
>S2.display(number);
これはやってはいけないと思いますが、
メッセージをSample2に送るかbool値のフラグを立てるかして、
Sample2で実行すべきだと思います。
元発言に
「エラーの原因について理解する事が出来ました。」
とあるから、何がどうイケナイのかはわかってんでしょう。
解決策は「ダイアログが世の中に現れてから操作すべし」って
こともおわかりのはず。
いろいろ指摘をして頂きありがとうございました。
みなさんに指摘して頂いた事を踏まえて
勉強をしていきます。
何を/どのように[[解決]]したのか添えるのがマナーってもんですぜ。