DXライブラリを使用したゲームを作成しているのですが、どうしても理解できないエラーが発生するためご教示願いたく書き込み致します。
ゲームのメインループ内から、ある関数を呼び出した際、その関数を抜けメインループ内に戻る時に
「ハンドルされない例外が 0x0109B028 (xxxxx.exe) で発生しました: 0xC0000005: 場所 0x0109B028 の実行中にアクセス違反が発生しました。」
(位置: xxxxx.exe!WinMainCRTStartup() 行 164)
という例外が発生します。(デバッグをVisualStudioのDebugモードで実行した場合です)
プロジェクトが大きく全体を公開することができないため一部だけの公開になり、あまり参考にならないかもしれませんが、下に該当箇所のコードを示します。
(loadScenario関数は、メインループからこんな関数が呼ばれますよ、という程度で実行時にはエラー無くこの関数の最後まで実行される、ということだけご理解頂けたら良いかと思います。長いですしこの関数だけで完結する処理でないので。)
メインループにてloadScenario()に入り、loadScenario()の最後の行からメインループに戻る際に上記のエラーが発生します。
また、VisualStudioのReleaseモードでデバッグを行った場合は、メインループからloadScenario()に入り、loadScenario()から抜け出す際にエラーは発生しませんが、
呼び出し元と異なる位置に戻されてしまいます。(メインループ内の全く見当違いの行にジャンプします)
また、loadScenario()の戻り値をvoidでなくintに変更しても同様の問題が発生しました。
こういった問題は何故発生するのでしょうか。
関数はエラーなく最終行まで行けば、当然呼び出し元にエラーなく戻るものだと思っているのですが…
せめて解決の手がかりを頂ければと思います。
宜しくお願いします。
(main.cpp)メインループ内
if(CheckHitKey(KEY_INPUT_F9) && clickedF9 == 0){
clickedF9 = 1;
loadScenario(); // ← ここで問題の関数を呼び出します
user_execute_command = 1;
break;
}
void loadScenario(){
//cmdInitimage(NULL);
//データのロードサンプル
FILE *fin;
static SaveData SD;
static int j;
int decode_img;
savedata_loading_flg = 1;
fin = fopen("./save/save1.data", "rb");
fread(&SD, sizeof(SD), 1, fin);
fclose(fin);
decode_img = CreateGraphFromMem(SD.thumbnail, sizeof(SD.thumbnail));
//DrawGraph(0, 0, decode_img, FALSE);
script.filename = SD.scenario_file;
strcpy(last_loaded_script_file, SD.scenario_file);
memcpy(g_message_backlog, SD.backlog_message, sizeof(g_message_backlog));
memcpy(g_message_backlog_icon, SD.backlog_message_icon, sizeof(g_message_backlog_icon));
InitGraph();
for(int i = 0; i < GRAPHIC_MAX_NUM; i++){
g_graphicManager[i].id = 0;
g_graphicManager[i].graphicHandle = 0;
strcpy(g_graphicManager[i].graphicName, "");
}
//マクロ読み込み履歴をリセット
for(int i = 0; i < 10; i++){
strcpy(loaded_macro_file[i], "");
}
//マクロを再ロード
for(j = 0; j < 10 && SD.loaded_macro_file[j][0] != '\0'; j++){
c = setjmp(jmpbuf1);//@returnタグの戻り先
if(c == 0){
loadMacroForCharArg(SD.loaded_macro_file[j]);
longjmp(jmpbuf2, 1);//シナリオメインループの先頭へジャンプ
}else{
c = 0;//@returnタグが出現したらここへ
}
} //この時点でgraphicManagerが上書きされる
//上書きされたgraphicManagerを元にvisibleGraphicを復元する
memcpy(g_visibleGraphic, SD.g_visibleGraphic, sizeof(g_visibleGraphic));
//visibleGraphicと同名ファイルを持つgraphicManagerのハンドルを取得する
for(int j = 0; j < GRAPHIC_MAX_NUM; j++){
for( int k = 0; k < VISIBLE_GRAPHIC_MAX_NUM; k++){
if(g_graphicManager[j].graphicName != NULL && g_graphicManager[j].graphicName != "" && g_visibleGraphic[k].graphicName != NULL && g_visibleGraphic[k].graphicName != ""){
if(strcmp(g_graphicManager[j].graphicName, g_visibleGraphic[k].graphicName) == 0){
g_visibleGraphic[k].graphicHandle = g_graphicManager[j].graphicHandle;
break;
}
}
}
}
//未実装
//memcpy(g_visibleFace, SD.g_visibleFace, sizeof(g_visibleFace));
//memcpy(g_bgGraphicManager, SD.g_bgGraphicManager, sizeof(g_bgGraphicManager));
script.currentLine = SD.current_line;
savedata_loading_flg = 0;
}