ハンドルされない例外とは?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Qloeh
記事: 35
登録日時: 10年前

ハンドルされない例外とは?

#1

投稿記事 by Qloeh » 10年前

重ねてすみません。データを読み込む関数で、イベントデータを読み込もうとするとビルドしたときに動作が停止します。ブレークポイントで確認したところハンドルされない例外があるとの事ですが、エラーメッセージの意味がよくわかりません。
読み込み用のコードは以下の通り、ヘッダー扱いです。

コード:

void fileload(void){
	int f, g, h;
	LoadDivGraph("Graphic/MapChip/kusa-miti.png", 5, 1, 5, 32, 32, map_chip[0]);

	LoadDivGraph("Graphic/CharaChip/86ccee6ae35de3bbc86141b6782bcf2d.png", 12, 3, 4, 32, 32, chara_chip[0]);
	LoadDivGraph("Graphic/CharaChip/EDGE2.png", 12, 3, 4, 32, 32, chara[4].chip);
	window[0] = LoadGraph("Graphic/System/window_shadow.png");
	window[1] = LoadGraph("Graphic/System/window1.png");
	FILE*fp;
	if ((fopen_s(&fp, "map.txt", "r")) != 0)
		printf("This file cannot open \n");
	else{
		f = 0;
		g = 0;
		while (fscanf_s(fp, "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", &map[f][g][0], &map[f][g][1],
			&map[f][g][2], &map[f][g][3], &map[f][g][4], &map[f][g][5], &map[f][g][6], &map[f][g][7],
			&map[f][g][8], &map[f][g][9], &map[f][g][10], &map[f][g][11], &map[f][g][12], &map[f][g][13],
			&map[f][g][14], &map[f][g][15], &map[f][g][16], &map[f][g][17], &map[f][g][18], &map[f][g][19],
			&map[f][g][19]) == 20){
			g++;
			if (g == 15){
				f = f + 1;
				g = 0;
			}
		}
		fclose(fp);
	
		if ((fopen_s(&fp, "event.txt", "r")) != 0)
			printf("This file cannot open \n");
		else{
			h = 0;
			while (fscanf_s(fp, "%d%d%d%d%d%d%d%d%d%d%d%d%d %s%s%s", &chara_eve[h].no, &chara_eve[h].chara_no,
				&chara_eve[h].pos_x, &chara_eve[h].pos_y, &chara_eve[h].map, &chara_eve[h].battle, &chara_eve[h].eve_flag,
				&chara_eve[h].bgm, &chara_eve[h].face_no, &chara_eve[h].chip_vector, &chara_eve[h].flag, &chara_eve[h].kihatu,
				&chara_eve[h].talk_count, chara_eve[h].kaiwa[0], chara_eve[h].kaiwa[1], chara_eve[h].kaiwa[2]) == 16){
				h = h + 1;
			}
			fclose(fp);
		}
	}
}
一応、メインのソースも載せます。

コード:

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	fileload();
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll(key) == 0){
		draw_map();
		DrawGraph(s_pos_x * 32, s_pos_y * 32, chara_chip[0][s_vector], TRUE);
		if (key[KEY_INPUT_RETURN] == 1){
			while (CheckHitKey(KEY_INPUT_RETURN) == 1);
			event_check();
		}
		else{
		if (key[KEY_INPUT_UP] == 1){
			if (s_pos_y > 0){
				s_pos_y -= 1;
				vector_up();
			}
			else{
				vector_up();
				map_check();
			}
		}
		if (key[KEY_INPUT_DOWN] == 1){
			if (s_pos_y < 14){
				s_pos_y += 1;
				vector_down();
			}
			else{
				vector_down();
				map_check();
			}
		}
		if (key[KEY_INPUT_RIGHT] == 1){
			if (s_pos_x < 19){
				s_pos_x += 1;
				vector_right();
			}
			else{
				vector_right();
				map_check();
			}
		}
		if (key[KEY_INPUT_LEFT] == 1){
			if (s_pos_x > 0){
				s_pos_x -= 1;
				vector_left();
			}
			else{
				vector_left();
				map_check();
			}
		}
		WaitTimer(40);
	}
}
		DxLib_End();
		return 0;
	}
	
エラーメッセージは以下の通りです。
初回例外が 0x00770EC4 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x00FB5000 への書き込み中にアクセス違反が発生しました。
初回例外が 0x4E931631 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x4E931631 の実行中にアクセス違反が発生しました。
初回例外が 0x4E931631 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x4E931631 の実行中にアクセス違反が発生しました。
初回例外が 0x4E931631 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x4E931631 の実行中にアクセス違反が発生しました。
初回例外が 0x4E931631 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x4E931631 の実行中にアクセス違反が発生しました。
初回例外が 0x77E48CDE (ntdll.dll) で発生しました (Dxsample.exe 内): 0xC0000005: 場所 0xFEFEFF06 の読み取り中にアクセス違反が発生しました。
初回例外が 0x4E931631 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x4E931631 の実行中にアクセス違反が発生しました。
ハンドルされない例外が 0x77E48CDE (ntdll.dll) で発生しました(Dxsample.exe 内): 0xC0000005: 場所 0xFEFEFF06 の読み取り中にアクセス違反が発生しました。

プログラム '[16740] Dxsample.exe' はコード 0 (0x0) で終了しました。

エラーの場所がいまいちわかりづらいです。16進法で読むのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外とは?

#2

投稿記事 by みけCAT » 10年前

Qloeh さんが書きました:

コード:

			while (fscanf_s(fp, "%d%d%d%d%d%d%d%d%d%d%d%d%d %s%s%s", &chara_eve[h].no, &chara_eve[h].chara_no,
				&chara_eve[h].pos_x, &chara_eve[h].pos_y, &chara_eve[h].map, &chara_eve[h].battle, &chara_eve[h].eve_flag,
				&chara_eve[h].bgm, &chara_eve[h].face_no, &chara_eve[h].chip_vector, &chara_eve[h].flag, &chara_eve[h].kihatu,
				&chara_eve[h].talk_count, chara_eve[h].kaiwa[0], chara_eve[h].kaiwa[1], chara_eve[h].kaiwa[2]) == 16){
直接の原因かは詳しく見ていないのでわかりませんが、fscanf_sで%sを使用するときに必要なバッファサイズの指定が無いのでまずいかもしれません。
セキュリティが強化された関数 (_s サフィックス付き) とその他のバージョンの関数との主な違いは、セキュリティが強化された関数では、c、C、s、S、および [ の各型フィールドを使用するとき、引数として、それぞれの変数の直後にフィールドのサイズを渡す必要がある点です。
fscanf_s、_fscanf_s_l、fwscanf_s、_fwscanf_s_l
Qloeh さんが書きました:エラーの場所がいまいちわかりづらいです。16進法で読むのでしょうか?
GCC (MinGW)を使うと
  • fscanfやfopenなどのC言語標準ライブラリに対応しています。fscanf_sなどの特殊な関数を使わずにすみます。
  • -g3オプションをつけてコンパイルし、gdbを使って実行することにより、ソースコード中のアクセス違反が起きた場所が分かる場合があります。
乗り換えを検討するのもいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: ハンドルされない例外とは?

#3

投稿記事 by Qloeh » 10年前

バッファサイズの指定が無いというのがよくわからないのですが。
%sの前かあとに数字を指定するのか、また別にパラメータを作るのでしょうか?
ネットで少し調べてみましたが理解力不足なのかよくは分かりませんでした。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外とは?

#4

投稿記事 by みけCAT » 10年前

Qloeh さんが書きました:バッファサイズの指定が無いというのがよくわからないのですが。
%sの前かあとに数字を指定するのか、また別にパラメータを作るのでしょうか?
引数で渡している%sに対応するバッファへのポインタの直後にそのバッファのサイズのデータを挿入すればいいと思います。
scanf および wscanf とは異なり、scanf_s および wscanf_s では、c、C、s、S の各型、または [] で囲まれた文字列コントロール セットのすべての入力パラメーターに対してバッファー サイズを指定する必要があります。 バッファー サイズ (文字単位) は、バッファーまたは変数のポインターの直後に追加パラメーターとして渡されます。 たとえば、文字列を読み込む場合、その文字列のバッファー サイズは次のように渡されます。

char s[10];

scanf_s("%9s", s, _countof(s)); // buffer size is 10, width specification is 9

バッファー サイズには、終端 null も含まれます。
scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l
Qloeh さんが書きました:ネットで少し調べてみましたが理解力不足なのかよくは分かりませんでした。
不正な(長すぎる)入力が渡されないと信じるのであれば、こんな面倒なことをしなくてすむfscanf関数に対応したGCCを使うことをおすすめします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: ハンドルされない例外とは?

#5

投稿記事 by Qloeh » 10年前

サイズを指定しても駄目でしたね。エラーの場所が分かればなんとかなるとは思いますが、行やファイル名でないので困っている感じです。またGCCとやらに乗り換えても、使っているテキストがVisual Stdio基準なので一からやり直しになり、煩雑です。読み込んでいるテキストにも不備があるのかもしれません。別に不正な入力をどうしてもしたい訳でもありません。警告文をdefineしてもエラーが出るので行き詰った感じです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外とは?

#6

投稿記事 by みけCAT » 10年前

mapとchara_eveの型を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外とは?

#7

投稿記事 by みけCAT » 10年前

Qloeh さんが書きました:エラーの場所が分かればなんとかなるとは思いますが、行やファイル名でないので困っている感じです。
コードの各行の間にMessageBoxAやBeepの呼び出しを追加することで、それらの関数によるメッセージや音が出たかどうかでどこを処理しているかを探る方法もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: ハンドルされない例外とは?

#8

投稿記事 by Qloeh » 10年前

型は構造体の事でしょうか?

コード:

int map[10][15][20];

struct chara1{
	int no;
	int chara_no;
	int pos_x;
	int pos_y;
	int map;
	int battle;
	int eve_flag;
	int bgm;
	int face_no;
	int chip_vector;
	bool flag;
	int kihatu;
	int talk_count;
	char kaiwa[3][30];
};
static struct chara1 chara_eve[30] = { 0 };
ヘッダーファイルにこの宣言をしてあります。
これではないというなら追って投下します。返信が遅れて申し訳ありません

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外とは?

#9

投稿記事 by みけCAT » 10年前

Qloeh さんが書きました:型は構造体の事でしょうか?
型は型です。構造体かもしれないですし、構造体ではないかもしれないです。
Qloeh さんが書きました:これではないというなら追って投下します。
これで大丈夫です。

bool型の変数に%dで読み込もうとしている所がありますね。
もしかしたら何かヤバいことが起こるかもしれないし、アラインメントの関係で助かるかもしれないし、そもそも普通に大丈夫なのかもしれないし…
よくわかりませんが、怪しいことはしないほうがいい気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: ハンドルされない例外とは?

#10

投稿記事 by Qloeh » 10年前

boolの箇所をintに変更しましたが、やっぱりアクセス違反が出ます。
エラーメッセージは下の通りですね。
初回例外が 0x015F0EC4 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x01E35000 への書き込み中にアクセス違反が発生しました。
初回例外が 0x77C78CDE (ntdll.dll) で発生しました (Dxsample.exe 内): 0xC0000005: 場所 0xFEFEFF06 の読み取り中にアクセス違反が発生しました。
初回例外が 0x2CA61081 (Dxsample.exe) で発生しました: 0xC0000005: 場所 0x2CA61081 の実行中にアクセス違反が発生しました。
ハンドルされない例外が 0x77C78CDE (ntdll.dll) で発生しました(Dxsample.exe 内): 0xC0000005: 場所 0xFEFEFF06 の読み取り中にアクセス違反が発生しました。

プログラム '[6560] Dxsample.exe' はコード 0 (0x0) で終了しました。
言い忘れてましたがevent.txtを読み込む部分のコードをコメントアウトすると上手くいくので、そこら辺が悪さをしているのだと思いますが、テキストは普通に実行できているんですよね……

Qloeh
記事: 35
登録日時: 10年前

Re: ハンドルされない例外とは?

#11

投稿記事 by Qloeh » 10年前

%s部分を消して実行すると普通にビルドできるので、そこに問題があると推測しました。また調べて、分からなかったら訊きにきます

閉鎖

“C言語何でも質問掲示板” へ戻る