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

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

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

#1

投稿記事 by aridai » 5年前

私はDxLibでゲームを作っているものですが、
〇〇.exeは動作を停止しました というerrorがでて、詰みました。
コンパイルエラーも出ませんでしたが、
Zキーを押した瞬間に上のエラーメッセージが出ます。

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

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

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

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

#2

投稿記事 by 夢幻ノ月夜 » 5年前

初期化漏れなどを確認してみては
毎回ゲーム作ろうとするたびに壁にぶち当たる

aridai
記事: 34
登録日時: 5年前

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

#3

投稿記事 by aridai » 5年前

さっきまで動いていたものが急に動かなくなりました。
タイトル画面

ワールドマップ

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 5年前

プログラムでコンパイルエラーが出ずに実行時エラーが出るのは良くあることです。
と言うより、それが普通です。先ほどまで動いていたものが動かなくなる事はよくあると思ってください。
なので、デバッグの方法を覚えましょう。

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

「エラーメッセージが出ます。」のエラーメッセージが不明なので、現在答えられるのはこのぐらいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aridai
記事: 34
登録日時: 5年前

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

#5

投稿記事 by aridai » 5年前

テキストからワールドマップのデータをロードする処理で
ファイルのなんとか違反が起きているようです。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 5年前

その情報の詳細を頂きたいです。
「ファイルのなんとか違反」では、こちらも良く分かりません。
それと、それに関係するopen関数の部分のソースコードを見せてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aridai
記事: 34
登録日時: 5年前

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

#7

投稿記事 by aridai » 5年前

コード:

	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で保存しています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 5年前

エラーの詳細は分かりませんか?
ソースコードだけでは、こちらにはデータが有るわけではないので、再現することは困難です。
どの行でエラーが出るかも教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#9

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

char型二次元配列マップとファイル読み込み
このプロジェクトの続きでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aridai
記事: 34
登録日時: 5年前

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

#10

投稿記事 by aridai » 5年前

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

aridai
記事: 34
登録日時: 5年前

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

#11

投稿記事 by aridai » 5年前

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

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

aridai
記事: 34
登録日時: 5年前

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

#12

投稿記事 by aridai » 5年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#13

投稿記事 by softya(ソフト屋) » 5年前

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のアカウント持っていないのと、ちょっと病気で体力がないので返事ができるのは明日になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#14

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

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キーを押すと正常終了しました。
実験に使用したソースとバイナリを添付します。(画像は適当なものに差し替えておきました)
添付ファイル
src_run.zip
実験に使用したソースとバイナリ
(3.86 MiB) ダウンロード数: 33 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

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

#15

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

softya(ソフト屋) さんが書きました:DropBoxのアカウント持っていないのと
このファイルはDropBoxのアカウントを持っていなくても、
インターネット環境とディスクの空き容量が十分であり、宗教上の理由(こだわり)が無ければダウンロードできます(できました)。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aridai
記事: 34
登録日時: 5年前

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

#16

投稿記事 by aridai » 5年前

いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接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));

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

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

#17

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

aridai さんが書きました:いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接2次元配列を書いたらできたんですが、
テキストからの読み込みにしたいです。
worldmapdata_subの大きさが小さいからではないですか?
worldmapdata_sub[12][20]をworldmapdata_sub[15][200]にして同じテストを行うとどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aridai
記事: 34
登録日時: 5年前

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

#18

投稿記事 by aridai » 5年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

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

#19

投稿記事 by softya(ソフト屋) » 5年前

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

・直値による誤解を防ぐ。同じ値がプログラムに何度も出てこないようにconst化する。
・変数名により誤解を防ぐ。間違いやすいのは名前に問題がある可能性。あるいはプログラム的に違う名前では扱えないようにガードしてしまう。
・添字が変な値ならないか、プログラムでガードを設ける。
などなどを気をつけてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aridai
記事: 34
登録日時: 5年前

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

#20

投稿記事 by aridai » 5年前

ありがとうございました。
>>softyaさん
アドバイスありがとうございました。

閉鎖

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