現在、腰痛と頭痛と鼻づまりに苦しんでいるが、大したことはない。
と思うことにした、どぶろくです。
プログラムも、ちょこちょこ、いじって楽しんでいる。
RPGのクラス化をしている。難しい、C++は難しい!
今まで分割コンパイルをしてこなかったツケがまわってきた感じだ。
そもそも windows.h を読み込むたびに待たされるのが嫌だったのだ。
今のPCは早くなったものだ。
分割コンパイルしても待たされなくなったのでクラス化している。
それにともないヘッダファイルが増えていっているのだが、
BCC Developer は32個までしかファイルをひらけないらしい?
これには困った。が、これも大したことはないと思うことにした。
なぜなら、これも病気だと思うからだ。
今頃になってクラス化
Re: 今頃になってクラス化
やっとコンパイル成功!
imm.h と mmsystem.h を windows.h の前に読みこんでいたのがエラーの原因でした。
これでクラス化に専念できます。
ところが順調だと思っていたら Release でデバッグなしでコンパイルしたら、
終了のとき画面が白くなってフリーズしました。
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT){
break;
}
を
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
end = GetMessage(&msg, NULL, 0, 0);
if (end == 0 || end == -1){
break;
}
にしたらフリーズせずに終了できました。
よくよく考えたら、msg.message の内容を見てみれば良かったと思い、
元に戻したら、なぜかフリーズせずに終了しました。
あまり深入りせずに下の GetMessage を使うやり方にしました。
imm.h と mmsystem.h を windows.h の前に読みこんでいたのがエラーの原因でした。
これでクラス化に専念できます。
ところが順調だと思っていたら Release でデバッグなしでコンパイルしたら、
終了のとき画面が白くなってフリーズしました。
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT){
break;
}
を
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
end = GetMessage(&msg, NULL, 0, 0);
if (end == 0 || end == -1){
break;
}
にしたらフリーズせずに終了できました。
よくよく考えたら、msg.message の内容を見てみれば良かったと思い、
元に戻したら、なぜかフリーズせずに終了しました。
あまり深入りせずに下の GetMessage を使うやり方にしました。
最後に編集したユーザー どぶろく on 2014年10月22日(水) 19:38 [ 編集 1 回目 ]
Re: 今頃になってクラス化
またまた終了時にフリーズするようになった。
どうやら GetMessage に関係ないようだ。
構造体を new してたので 0 で初期化してみた。なんとすぐ終了してしまった。
どうやら読み込んだ BMPファイルのポインタが NULL になっている。
画像は表示されていたのに BMPファイルのポインタが NULL なのはおかしい。
いろいろ考えたら 引数でポインタを受け取るにはポインタ変数のアドレスを渡すべきだった。
ポインタのポインタ(ダブルポインタ=2重ポインタ)の出番だった。
今まで画像が表示されていたので気付かなかったが画像が不用になった時に、メモリが解放されていなかったのだ。
今頃バグに気が付くとは情けないが、ありがたいことだった。
また一つプログラム王に近づいたぞ!(嬉)
//---------------------------------------------------------------------------
// 画像ファイルを読み込んでDIBを作成
//---------------------------------------------------------------------------
PDIB r05_offScreen::mk_dib(char** ppFile, LPSTR pFname)
{
PDIB pDIB;
*ppFile = file->my_open(pFname); // BMPファイルを読み込む
if(!*ppFile){
return NULL;
}
pDIB = (PDIB)(*ppFile+FILEHED_SIZ()); // LPBITMAPINFO
return pDIB;
}
どうやら GetMessage に関係ないようだ。
構造体を new してたので 0 で初期化してみた。なんとすぐ終了してしまった。
どうやら読み込んだ BMPファイルのポインタが NULL になっている。
画像は表示されていたのに BMPファイルのポインタが NULL なのはおかしい。
いろいろ考えたら 引数でポインタを受け取るにはポインタ変数のアドレスを渡すべきだった。
ポインタのポインタ(ダブルポインタ=2重ポインタ)の出番だった。
今まで画像が表示されていたので気付かなかったが画像が不用になった時に、メモリが解放されていなかったのだ。
今頃バグに気が付くとは情けないが、ありがたいことだった。
また一つプログラム王に近づいたぞ!(嬉)
//---------------------------------------------------------------------------
// 画像ファイルを読み込んでDIBを作成
//---------------------------------------------------------------------------
PDIB r05_offScreen::mk_dib(char** ppFile, LPSTR pFname)
{
PDIB pDIB;
*ppFile = file->my_open(pFname); // BMPファイルを読み込む
if(!*ppFile){
return NULL;
}
pDIB = (PDIB)(*ppFile+FILEHED_SIZ()); // LPBITMAPINFO
return pDIB;
}