Poco さんが書きました:
お使いのPCはクアッドコアですか?
だとしたらCPU使用率が25%で固定になっているなら、コアのうち1つが無限ループ状態になっていると
考えればよいかと。
そういう意味があったりするんですね。
これから覚えておきます。
ちなみにコンピュータのプロパティーを見てみると以下のように書いてありました。
プロセッサ:Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz 2.13 Ghz
softya(ソフト屋) さんが書きました:それでバグは本当に治ったのでしょうか?
私には、まだ潜んでいる気がしてなりません。
※ x,yを大きな数字にだけにしてみるとバグが再現するかもしれません。
偶然発生しない状況で直ったと思い込むのはデバッグした事にはなりませんよ。
私が設けている上限であるマス100×100の爆弾5000で試してみました。
(画面結構でかいな・・・w)
すると、以下のようなエラーになりました。
「マインスイーパー.exe の 0x782ac459 (mfc90ud.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0000000c を読み込み中にアクセス違反が発生しました。」
コード:
//開かれたafxwin1.cpp一部抜粋
_AFXWIN_INLINE BOOL CDC::Rectangle(LPCRECT lpRect)
{ ASSERT(m_hDC != NULL); return ::Rectangle(m_hDC, lpRect->left, lpRect->top,
lpRect->right, lpRect->bottom); } //この行に矢印が出ました。
_AFXWIN_INLINE BOOL CDC::RoundRect(int x1, int y1, int x2, int y2, int x3, int y3)
{ ASSERT(m_hDC != NULL); return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3); }
でもそのまま止めてもう一度実行すると、何も問題なく画面にはみ出るほどの大きいウィンドウがきちんと表示されました。
ということは、設定の変更でウィンドウサイズを変更したりするときは問題が起きるけど、初期設定でそうならうまく対処してくれるんだと思いました。
そのままプログラムを閉じずに設定をマス75×75の爆弾3000にして試してみました。
すると、今度は以下のようなエラーになりました。
「マインスイーパー.exe の 0x0025c1d0 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfeeefeee を読み込み中にアクセス違反が発生しました。」
コード:
//矢印のあるマインスイーパーView.cpp一部抜粋
for(int x=0;x<pDoc->blocks.x;x++){
for(int y=0;y<pDoc->blocks.y;y++){
if(pDoc->data[x][y]<0){ //この行に矢印が出ました。
block_color.CreateSolidBrush(RGB(180,180,180));
}
自動変数に
pDoc->data 0x01651b80 int * *
0xfeeefeee int *
CXX0030: エラーです: 式を評価できません
pDoc->data[x] 0xfeeefeee int *
CXX0030: エラーです: 式を評価できません
とも表示されています。
でも、プログラムを止めてまた実行させてみると、まだ画面からはみ出るほど大きいウィンドウがなんのエラーもなく表示されました。
そのまま設定をマス50×50の爆弾1000に設定してみると、また同じエラーになりました。
でも、またプログラムを止めてまた実行させてみると、縦だけ画面からはみ出るくらい大きいウィンドウがなんのエラーもなく表示されました。
初期値だと問題ないのに設定変更だとエラーになるのは、PCの画面のサイズよりプログラムのウィンドウのサイズが大きいからですかね?
と思いつつ今度はマス25×50の爆弾500に設定してみましたが、それでも同じエラーになりました。
これも初期設定がそれだとエラーにはならないんですけどね。
そこでもしやと実は試していなかった設定で上級を選ぶというのをやってみると、これも同じエラーになりました。
なぜだろうと考えてみると、設定を変更させた後にマスのサイズに合わせてmallocしたりしているゲーム初期設定の関数を呼び出すのを忘れていました。
質問したときのエラーもそれが原因だと思います。
なぜなら設定で上級にしたときにあのようなエラーになりましたから。
でも同じような条件でやったはずの中級が問題なかったのが不思議ですが。
そのあとでmallocがうまくいっているかのif文を書き、設定を変更したらまたmallocされるつもりで設定変更後にメモリの解放をしておいた方がいいと思ってmallocに使った変数をfree関数に入れたりはしていましたが、結局実は設定変更の後ゲーム初期設定の関数を呼んでいなかったと。
でもこれで設定の最大値でもその他失敗した設定でも設定変更でエラーになることもなくなりましたから、今度こそ問題ないですよね?