ページ 11

画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 15:46
by namari

コード:

#include "../../../include/DxLib.h"

//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	int img_board;
    while(ProcessLoop()==0){//メインループ
		img_board=LoadGraph("dat/img/else/help.png");//ここでエラー
		ScreenFlip();//裏画面反映
	}

    DxLib_End();//DXライブラリ終了処理
    return 0;
}
特に関係ない瑣末な部分をいじっていたはずなんですが、
なぜか突然、一番最初に読み込まれる画像でハンドルの例外が出てくるようになってしまいました。
上記はなるべくほかの部分を削って、短略化したコードですが、
これでもエラーが出ます。(デバッグは通るが、起動後すぐにエラーを吐く)

エラーメッセージは
「ハンドルされない例外が0x01025F5A0で発生しました:
0xC0000005:場所0x054D1000への書き込み中にアクセス違反が発生しました。」
です。

アドバイスいただけると嬉しいです。

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:17
by Rittai_3D
ざっと見た感じは問題が無いようです。
ちなみに、ProcessLoop() の中身はどうなっていますか?
オフトピック
直接関係ないですが、毎フレーム画像を読み込むのではなくて、メインループに入る前に読み込むべきです。

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:22
by namari
>Rittai_3Dさん
すみません。
入れ損なってました。

コード:

#include "../../../include/DxLib.h"
 
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    return 0;
}
//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    int img_board;
    while(ProcessLoop()==0){//メインループ
        img_board=LoadGraph("dat/img/else/help.png");//ここでエラー
        ScreenFlip();//裏画面反映
    }
 
    DxLib_End();//DXライブラリ終了処理
    return 0;
}
これで、全コードです。

>直接関係ないですが、毎フレーム画像を読み込むのではなくて、メインループに入る前に読み込むべきです。
確かにそうですね・・・
ちなみに今回の場合、デバッガ曰く最初の一回目でエラーを吐きます。

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:37
by Rittai_3D
こちらの環境では再現出来ませんでした。
Windows 7 Home Premium 64bit
DxLib ver 3.14f

メインループで画像を読み込まないようにしたこのコードを試してみてください。

コード:

#include "../../../include/DxLib.h"
 
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    return 0;
}
//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    int img_board=LoadGraph("dat/img/else/help.png");

    while(ProcessLoop()==0){//メインループ
        DrawGraph( 0, 0, img_board, TRUE );
        ScreenFlip();//裏画面反映
    }
 
    DxLib_End();//DXライブラリ終了処理
    return 0;
}

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:43
by Rittai_3D
すいません。
コンパイラは Visual Studio 2015 Community を使用しています。
以下が実験用のコードです。
► スポイラーを表示

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:48
by namari
>Rittai_3D さん
起こりますね……。
どうやらコード自体の問題ではなく、外部的な問題のようです。


と思ったらやっと分かりました
datフォルダの他にdat.dxaをうっかり入れてしまったのが原因でした。
二重に画像があって混乱させたんでしょうね。

関係ないんですが、このバグ修正中にうっかりコピー前のコードを一部削除してしまったんですが、
visual C++に履歴機能はないんでしょうか……一回ウィンドウを消してしまったのでctrl+Zは使えません……。

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:53
by プラム
Rittai_3D さんが書きました:
オフトピック
直接関係ないですが、毎フレーム画像を読み込むのではなくて、メインループに入る前に読み込むべきです。
3Dさんの言うとうり、

コード:

#include "../../../include/DxLib.h"
 
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    return 0;
}
//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    int img_board;
    img_board=LoadGraph("dat/img/else/help.png");//ここ
 
 while(ProcessLoop()==0){//メインループ
        ScreenFlip();//裏画面反映
    }
 
    DxLib_End();//DXライブラリ終了処理
    return 0;
}
とするべきです。
そうでないと、メモリを無駄に大量に使う破目になります。

それと、僕が今試してみたんですが、何の例外も起きず実行できました、
環境:Windows8.1
コンパイラ:VisualC++2010
コンパイラは何を使ってますか?
Dxライブラリのバージョンは最新ですか?
コードではない他の部分に問題があるんだと思います、

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 16:57
by プラム
namari さんが書きました: 関係ないんですが、このバグ修正中にうっかりコピー前のコードを一部削除してしまったんですが、
visual C++に履歴機能はないんでしょうか……一回ウィンドウを消してしまったのでctrl+Zは使えません……。
うーん・・・たぶんそれはもう仕方ないと思います、
もう一度最初から書き直すしかないですね・・・

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 17:00
by Rittai_3D
namari さんが書きました: 関係ないんですが、このバグ修正中にうっかりコピー前のコードを一部削除してしまったんですが、
visual C++に履歴機能はないんでしょうか……一回ウィンドウを消してしまったのでctrl+Zは使えません……。
おそらく無理でしょう。 今後はバージョン管理ツールを利用するとよいかと思います。

Re: 画像を読み込むだけでハンドルされない例外

Posted: 2016年3月09日(水) 17:01
by namari
お二人共ありがとうございました。