ページ 11

〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 21:40
by aridai
私はDxLibでゲームを作っているものですが、
〇〇.exeは動作を停止しました というerrorがでて、詰みました。
コンパイルエラーも出ませんでしたが、
Zキーを押した瞬間に上のエラーメッセージが出ます。

環境は以下のとおりです。
Windows 8.1 64bit
Visual Studio Express 2013
DxLib 最新版

必要ならソースをアップします。
解決策を教えて下さい。
お願いします。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 21:57
by 夢幻ノ月夜
初期化漏れなどを確認してみては

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 22:00
by aridai
さっきまで動いていたものが急に動かなくなりました。
タイトル画面

ワールドマップ

のように画面を切り替えるときに
Zキーを押すのですが、
押した瞬間エラーが出ます。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 22:38
by softya(ソフト屋)
プログラムでコンパイルエラーが出ずに実行時エラーが出るのは良くあることです。
と言うより、それが普通です。先ほどまで動いていたものが動かなくなる事はよくあると思ってください。
なので、デバッグの方法を覚えましょう。

Visual Studio Express 2013であれば、デバッグビルドでデバッガ開始すれば問題のソース部分で停止するはずです。
それで何か分かりませんでしょうか?

「エラーメッセージが出ます。」のエラーメッセージが不明なので、現在答えられるのはこのぐらいです。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 22:49
by aridai
テキストからワールドマップのデータをロードする処理で
ファイルのなんとか違反が起きているようです。

別にそのテキストファイルを編集中ではないのですが、
この違反が出てきます。
Windowsを再起動させましたが、無理でした。

ちなみにテキストからデータを読み込む関数を消すと
〇〇.exeは動作を停止しました というメッセージがでなくなりました。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 22:55
by softya(ソフト屋)
その情報の詳細を頂きたいです。
「ファイルのなんとか違反」では、こちらも良く分かりません。
それと、それに関係するopen関数の部分のソースコードを見せてくださいね。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:00
by aridai

コード:

	char buf[256];
	sprintf(buf, "res\\mapdata\\worldmap.txt"); // ファイル名の取得
	int handle = FileRead_open(buf, FALSE); // ファイルの展開

	for (int i = 0; i < 15; i++)
	{
		char map_buffer[256] = { 0 };

		FileRead_gets(map_buffer, sizeof(map_buffer), handle);

		for (int j = 0; j < 200; j++)
		{
			worldmapdata[i][j] = map_buffer[j];
		}
	}
	FileRead_close(handle);
です。
パスの場所に worldmap.txt を 文字コードANSIで保存しています。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:17
by softya(ソフト屋)
エラーの詳細は分かりませんか?
ソースコードだけでは、こちらにはデータが有るわけではないので、再現することは困難です。
どの行でエラーが出るかも教えてください。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:25
by みけCAT
char型二次元配列マップとファイル読み込み
このプロジェクトの続きでしょうか?

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:30
by aridai
>>みけCATさん
あの時はありがとうございました。
それから正常に動作していましたが、
今日、その部分をいじっていないのにかかわらずエラーが出たので
トピックを建てさせて頂いております。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:37
by aridai
>>softyaさん
初回例外が 0x00EF12C6 (〇〇.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00EF12C6 (yukkurigame.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
と出ました。よくわからないです。
ブレークポイントを一行づつ付けながらもやってみたんですが、よくわかりませんでした。
0x00000014 の読み取り中 ってどういうことですかね。
メモリのアドレスを表しているのですか。
もしかして、テキストファイルのハンドルが示すアドレスを表しているのでしょうか。

私がデバッグ機能を使えていないからですかね。
勉強しておきます。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月07日(土) 23:55
by aridai
https://www.dropbox.com/s/boy4lrkhxs6zsvb/src.7z?dl=0
DropBoxにソースをあげておきました。
何も整理していないですし、画像素材提供者さんからの許可もアレなのですぐに消します。

頼りすぎてすいません。
自分の勉強不足を実感しました。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 00:04
by softya(ソフト屋)
aridai さんが書きました:>>softyaさん
初回例外が 0x00EF12C6 (〇〇.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00EF12C6 (yukkurigame.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
と出ました。よくわからないです。
ブレークポイントを一行づつ付けながらもやってみたんですが、よくわかりませんでした。
0x00000014 の読み取り中 ってどういうことですかね。
メモリのアドレスを表しているのですか。
もしかして、テキストファイルのハンドルが示すアドレスを表しているのでしょうか。

私がデバッグ機能を使えていないからですかね。
勉強しておきます。
それはC/C++でよくあるOSのメモリ保護例外です。ポインタ操作などを誤った場合に発生しやすくOSが保護している領域をアクセスしています。
エラーが発生した場合、ウィンドウで中断が選べると思いますが、そのときにソース行が表示されるはずです。
この情報から分かるのは、ファイル操作は関係あるのか無いのかも分かりません。
どの行で止まったか。それが必要な情報です。

「アクセス違反をデバッグするには」
https://msdn.microsoft.com/ja-jp/librar ... .120).aspx


すいません。DropBoxのアカウント持っていないのと、ちょっと病気で体力がないので返事ができるのは明日になります。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 00:29
by みけCAT
load.cppの33行目に

コード:

sprintf_s(buf, "res\\image\\player\\Marisa%d.png", i);
という記述がありました。
sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
によると、sprintf_s関数の第二引数はバッファサイズ、第三引数に書式文字列を指定するべきであるはずですが、
第三引数に0が渡されており、その結果NULLに書式を読みに行くことになり、アクセス違反になる可能性があります。
※実際に動かしたわけではありません。
ここでもsprintf_sではなく、sprintfを使用するように統一するといいと思います。

また、適当にGCCでコンパイルが通るように修正し、実行したところ、タイトル画面が表示され、Zキーを押すと正常終了しました。
実験に使用したソースとバイナリを添付します。(画像は適当なものに差し替えておきました)

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 08:22
by みけCAT
softya(ソフト屋) さんが書きました:DropBoxのアカウント持っていないのと
このファイルはDropBoxのアカウントを持っていなくても、
インターネット環境とディスクの空き容量が十分であり、宗教上の理由(こだわり)が無ければダウンロードできます(できました)。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 09:08
by aridai
いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接2次元配列を書いたらできたんですが、
テキストからの読み込みにしたいです。

コード:

	/*char buf[256];
	sprintf(buf, "res\\mapdata\\worldmap.txt"); // ファイル名の取得
	int handle = FileRead_open(buf, FALSE); // ファイルの展開

	for (int i = 0; i < 15; i++)
	{
		char map_buffer[256] = {0};

		FileRead_gets(map_buffer, sizeof(map_buffer), handle);

		for (int j = 0; j < 200; j++)
		{
			worldmapdata[i][j] = map_buffer[j];
		}
	}
	FileRead_close(handle);*/

	char worldmapdata_sub[12][20] =
	{
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g' },
		{ 'g', 'g', '0', 'N', 'w', '@', 'w', 'w', '1', 'w', 'w', '2', 'w', 'w', 'C', 'w', 'w', '3', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'j', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'j', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'j', 'g', 'g', 'g', 'g', 'n', 'n', 'n', 'g', 'j', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'I', 'w', 'w', '4', 'w', 'w', '6', 'w', 'N', 'b', 'N', 'w', '4', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'n', 'N', 'n', 'g', 'g', 'g', 'g' },
		{ 'g', 'n', 'n', 'n', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'j', 'g', 'g', 'g', 'g', 'g' },
		{ 'g', 'n', 'B', 'N', 'w', '9', 'w', 'w', 'C', 'w', 'w', '8', 'w', 'w', '7', 'w', 'w', 'I', 'g', 'g' },
		{ 'g', 'n', 'n', 'n', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g' },
		{ 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g' },
	};
	memcpy(worldmapdata, worldmapdata_sub, sizeof(worldmapdata_sub));

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 09:31
by みけCAT
aridai さんが書きました:いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接2次元配列を書いたらできたんですが、
テキストからの読み込みにしたいです。
worldmapdata_subの大きさが小さいからではないですか?
worldmapdata_sub[12][20]をworldmapdata_sub[15][200]にして同じテストを行うとどうなりますか?

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 09:51
by aridai
すいません。
わかりました。
ワールドマップは 640pix x 384pix 1マス 32pix x 32pix の規模で、
2次元配列だと [12][20] ですね。ステージ用とワールドマップ用のをごちゃまぜにしていました。
この間もこのようなミスをしていましたし、やっぱ観察力が足りないなと我ながら思います。
ありがとうございました。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月08日(日) 11:16
by softya(ソフト屋)
aridai さんが書きました:すいません。
わかりました。
ワールドマップは 640pix x 384pix 1マス 32pix x 32pix の規模で、
2次元配列だと [12][20] ですね。ステージ用とワールドマップ用のをごちゃまぜにしていました。
この間もこのようなミスをしていましたし、やっぱ観察力が足りないなと我ながら思います。
ありがとうございました。
ミスは誰でも起こるものです。プロもミスします。
このようなプログラム構造だとプロもミスしやすいでしょう。
つまり、プログラムの組み方でミスは減らせるので、そう言う工夫を徹底的に行うことで極力ミスを防ぎます。

・直値による誤解を防ぐ。同じ値がプログラムに何度も出てこないようにconst化する。
・変数名により誤解を防ぐ。間違いやすいのは名前に問題がある可能性。あるいはプログラム的に違う名前では扱えないようにガードしてしまう。
・添字が変な値ならないか、プログラムでガードを設ける。
などなどを気をつけてみてください。

Re: 〇〇.exeは動作を停止しました について

Posted: 2015年3月11日(水) 16:35
by aridai
ありがとうございました。
>>softyaさん
アドバイスありがとうございました。