.bat形式のあるデータ(球体の半径など)を読み取り、タイマー関数を用いてビットマップ形式で描画しようとしています。ビルドも無事にでき、実行したのですが、なぜか途中でエラーが起きます。半径の全データ数は約4600個あり、150msごとに再描画を繰り返す感じです。エラーのタイミングはさまざまで、2422番目のデータでストップしたり、3355番目でストップなどです。デバッグして調べたところ、全データの読み込みはちゃんとできていて、インフォヘッダーで書いた中身(g_img)が0になっていました。また、ハンドルされない例外が0x00365F6E で発生しました。や、書き込み中にアクセス違反が発生しました。といった文章がでてきました。メモリの解放のタイミングがおかしいのでしょうか?もしおかしければ解放のタイミングを知りたいです。また、この原因がメモリの解放以外にありそうでしたらアドバイスいただきたいです。メモリの解放のタイミング以外で考えると、BITMAPINFOHEADERもしくはCreatDIBitmap()のどこかがおかしいのだと考えています。ですが改善策がでてきません。よろしくお願いいたします。開発環境は、Visual Studio 2015 C++です。なお、まだ初心者なので、説明不足や知識不足、理解不足があるかもしれません。ご了承ください。下記に、描画するコードを載せておきます。
#include <math.h> #define ID_MYTIMER 1 typedef struct{ HINSTANCE hi0; HWND hwin7; BYTE *lpBmpData; BITMAPINFOHEADER bmp_ih; char *fname; int fsize; } IMG; IMG g_img; LRESULT CALLBACK WndProc_bitmap( HWND hWnd_bitmap, UINT msg, WPARAM wp, LPARAM lp ) { PAINTSTRUCT ps; HDC hdc, hdc_mem; HBITMAP hBmp; float x,y,z,r; int a, b, ab; float lam1,lam2,lam3; g_img.bmp_ih.biSize = sizeof(BITMAPINFOHEADER); g_img.bmp_ih.biWidth = 659/*674*/; g_img.bmp_ih.biHeight = -494/*532*/; g_img.bmp_ih.biPlanes = 1; g_img.bmp_ih.biBitCount = 32; g_img.bmp_ih.biCompression = BI_RGB; g_img.bmp_ih.biSizeImage = 659/*674*/ * 494/*532*/ * 4; g_img.bmp_ih.biXPelsPerMeter = 3704; g_img.bmp_ih.biYPelsPerMeter = 3704; g_img.bmp_ih.biClrUsed = 0; g_img.bmp_ih.biClrImportant = 0; g_img.lpBmpData = (BYTE *)malloc(659/*674*/*494/*532*/*4); switch (msg) { case WM_CREATE: //ウインドウが生成されたときに1度だけ通過 //時間割り込みの発生タイミングを設定 SetTimer(hWnd_bitmap, ID_MYTIMER, 150, NULL); break; case WM_TIMER: if (wp != ID_MYTIMER) return (DefWindowProc(hWnd_bitmap, msg, wp, lp)); k +=1; InvalidateRect(hWnd_bitmap, NULL, FALSE); break; case WM_PAINT: hdc = BeginPaint(hWnd_bitmap, &ps); hdc_mem = CreateCompatibleDC( hdc ); q = 0; p = 0; for ( a = 0; a < 494/*532*/; a++){ for( b = 0; b < 659/*674*/; b++){ ab = a*(659/*674*/*4) + b*4; //始めの項が行数、次の項が左から何ビット目かを表す。(blueの位置を決めている) if((b-329.5)*(b-329.5)+(a-494)*(a-494) <= (s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)){ p = p+1.0; //円の内側のピクセル数の合計 x = b-329.5; y = 494-a; z = sqrtf(-(x*x)-(y*y)+(s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)); r = sqrtf(x*x + y*y + z*z); lam1 = (x*XSUNm_3[k] + y*YSUNm_3[k] + z*ZSUNm_3[k])/(r*SUN_MOON[k]); //太陽の方向との内積 lam2 = (x*XEARTHm_3[k] + y*YEARTHm_3[k] + z*ZEARTHm_3[k])/(r*EARTH_MOON[k]); //地球の方向との内積 lam3 = (x*XEQLm_3[k] + y*YEQLm_3[k] + z*ZEQLm_3[k])/(r*EQL_MOON[k]); //EQLの方向との内積 /*g_img.lpBmpData[ab] = 179*lam3; g_img.lpBmpData[ab+1] = 179*lam3; g_img.lpBmpData[ab+2] = 179*lam3; g_img.lpBmpData[ab+3] = 0;*/ if(lam2>0){ g_img.lpBmpData[ab] = 230*lam2; g_img.lpBmpData[ab+1] = 216*lam2; g_img.lpBmpData[ab+2] = 0; g_img.lpBmpData[ab+3] = 0; } if(lam1>0){ g_img.lpBmpData[ab] = 0; g_img.lpBmpData[ab+1] = 255*lam1; g_img.lpBmpData[ab+2] = 255*lam1; g_img.lpBmpData[ab+3] = 0; } if(!(lam1>=0 || lam2>=0) ){ g_img.lpBmpData[ab] = 179*lam3; g_img.lpBmpData[ab+1] = 179*lam3; g_img.lpBmpData[ab+2] = 179*lam3; g_img.lpBmpData[ab+3] = 0; q = q+1; } if(494 < (s[k]/4*1000000*329.5+0.5)) ok = q*100/325546; if(494 >= (s[k]/4*1000000*329.5+0.5)) ok = q*100/p/*(M_PI* (s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)/2)*/; } // else{ if((b-329.5)*(b-329.5)+(a-494)*(a-494) > (s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)){ g_img.lpBmpData[ab] = 0; g_img.lpBmpData[ab+1] = 0; g_img.lpBmpData[ab+2] = 0; g_img.lpBmpData[ab+3] = 0; } } } hBmp = CreateDIBitmap(hdc, &(g_img.bmp_ih), CBM_INIT, g_img.lpBmpData, (BITMAPINFO *)(&(g_img.bmp_ih)), DIB_RGB_COLORS); free(g_img.lpBmpData); SelectObject(hdc_mem, hBmp); SetStretchBltMode(hdc, COLORONCOLOR); StretchBlt(hdc, 0, 0, 659/*674*/, 494/*532*/, hdc_mem, 0, 0, 659/*674*/, 494/*532*/, SRCCOPY); DeleteDC( hdc ); DeleteDC( hdc_mem ); DeleteObject( hBmp ); EndPaint(hWnd_bitmap, &ps); ReleaseDC( hWnd_bitmap, hdc ); break; mode_edit編集 arrow_downward自己解決方法を記入する attachment(0) thumb_up(0) 低評価 (0) delete
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/07 13:53
2017/12/08 07:44
2017/12/08 08:36
2017/12/08 09:23
2017/12/11 08:25
2017/12/11 17:25
2017/12/11 17:54
2017/12/12 08:57
2017/12/12 10:17
2017/12/12 12:02