〇〇.exeは動作を停止しました について
〇〇.exeは動作を停止しました について
私はDxLibでゲームを作っているものですが、
〇〇.exeは動作を停止しました というerrorがでて、詰みました。
コンパイルエラーも出ませんでしたが、
Zキーを押した瞬間に上のエラーメッセージが出ます。
環境は以下のとおりです。
Windows 8.1 64bit
Visual Studio Express 2013
DxLib 最新版
必要ならソースをアップします。
解決策を教えて下さい。
お願いします。
〇〇.exeは動作を停止しました というerrorがでて、詰みました。
コンパイルエラーも出ませんでしたが、
Zキーを押した瞬間に上のエラーメッセージが出ます。
環境は以下のとおりです。
Windows 8.1 64bit
Visual Studio Express 2013
DxLib 最新版
必要ならソースをアップします。
解決策を教えて下さい。
お願いします。
Re: 〇〇.exeは動作を停止しました について
さっきまで動いていたものが急に動かなくなりました。
タイトル画面
↓
ワールドマップ
のように画面を切り替えるときに
Zキーを押すのですが、
押した瞬間エラーが出ます。
タイトル画面
↓
ワールドマップ
のように画面を切り替えるときに
Zキーを押すのですが、
押した瞬間エラーが出ます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 〇〇.exeは動作を停止しました について
プログラムでコンパイルエラーが出ずに実行時エラーが出るのは良くあることです。
と言うより、それが普通です。先ほどまで動いていたものが動かなくなる事はよくあると思ってください。
なので、デバッグの方法を覚えましょう。
Visual Studio Express 2013であれば、デバッグビルドでデバッガ開始すれば問題のソース部分で停止するはずです。
それで何か分かりませんでしょうか?
「エラーメッセージが出ます。」のエラーメッセージが不明なので、現在答えられるのはこのぐらいです。
と言うより、それが普通です。先ほどまで動いていたものが動かなくなる事はよくあると思ってください。
なので、デバッグの方法を覚えましょう。
Visual Studio Express 2013であれば、デバッグビルドでデバッガ開始すれば問題のソース部分で停止するはずです。
それで何か分かりませんでしょうか?
「エラーメッセージが出ます。」のエラーメッセージが不明なので、現在答えられるのはこのぐらいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 〇〇.exeは動作を停止しました について
テキストからワールドマップのデータをロードする処理で
ファイルのなんとか違反が起きているようです。
別にそのテキストファイルを編集中ではないのですが、
この違反が出てきます。
Windowsを再起動させましたが、無理でした。
ちなみにテキストからデータを読み込む関数を消すと
〇〇.exeは動作を停止しました というメッセージがでなくなりました。
ファイルのなんとか違反が起きているようです。
別にそのテキストファイルを編集中ではないのですが、
この違反が出てきます。
Windowsを再起動させましたが、無理でした。
ちなみにテキストからデータを読み込む関数を消すと
〇〇.exeは動作を停止しました というメッセージがでなくなりました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 〇〇.exeは動作を停止しました について
その情報の詳細を頂きたいです。
「ファイルのなんとか違反」では、こちらも良く分かりません。
それと、それに関係するopen関数の部分のソースコードを見せてくださいね。
「ファイルのなんとか違反」では、こちらも良く分かりません。
それと、それに関係するopen関数の部分のソースコードを見せてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 〇〇.exeは動作を停止しました について
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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 〇〇.exeは動作を停止しました について
エラーの詳細は分かりませんか?
ソースコードだけでは、こちらにはデータが有るわけではないので、再現することは困難です。
どの行でエラーが出るかも教えてください。
ソースコードだけでは、こちらにはデータが有るわけではないので、再現することは困難です。
どの行でエラーが出るかも教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 〇〇.exeは動作を停止しました について
char型二次元配列マップとファイル読み込み
このプロジェクトの続きでしょうか?
このプロジェクトの続きでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 〇〇.exeは動作を停止しました について
>>みけCATさん
あの時はありがとうございました。
それから正常に動作していましたが、
今日、その部分をいじっていないのにかかわらずエラーが出たので
トピックを建てさせて頂いております。
あの時はありがとうございました。
それから正常に動作していましたが、
今日、その部分をいじっていないのにかかわらずエラーが出たので
トピックを建てさせて頂いております。
Re: 〇〇.exeは動作を停止しました について
>>softyaさん
初回例外が 0x00EF12C6 (〇〇.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00EF12C6 (yukkurigame.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
と出ました。よくわからないです。
ブレークポイントを一行づつ付けながらもやってみたんですが、よくわかりませんでした。
0x00000014 の読み取り中 ってどういうことですかね。
メモリのアドレスを表しているのですか。
もしかして、テキストファイルのハンドルが示すアドレスを表しているのでしょうか。
私がデバッグ機能を使えていないからですかね。
勉強しておきます。
初回例外が 0x00EF12C6 (〇〇.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00EF12C6 (yukkurigame.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
と出ました。よくわからないです。
ブレークポイントを一行づつ付けながらもやってみたんですが、よくわかりませんでした。
0x00000014 の読み取り中 ってどういうことですかね。
メモリのアドレスを表しているのですか。
もしかして、テキストファイルのハンドルが示すアドレスを表しているのでしょうか。
私がデバッグ機能を使えていないからですかね。
勉強しておきます。
Re: 〇〇.exeは動作を停止しました について
https://www.dropbox.com/s/boy4lrkhxs6zsvb/src.7z?dl=0
DropBoxにソースをあげておきました。
何も整理していないですし、画像素材提供者さんからの許可もアレなのですぐに消します。
頼りすぎてすいません。
自分の勉強不足を実感しました。
DropBoxにソースをあげておきました。
何も整理していないですし、画像素材提供者さんからの許可もアレなのですぐに消します。
頼りすぎてすいません。
自分の勉強不足を実感しました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 〇〇.exeは動作を停止しました について
それはC/C++でよくあるOSのメモリ保護例外です。ポインタ操作などを誤った場合に発生しやすくOSが保護している領域をアクセスしています。aridai さんが書きました:>>softyaさん
初回例外が 0x00EF12C6 (〇〇.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00EF12C6 (yukkurigame.exe) で発生しました: 0xC0000005: 場所 0x00000014 の読み取り中にアクセス違反が発生しました。
と出ました。よくわからないです。
ブレークポイントを一行づつ付けながらもやってみたんですが、よくわかりませんでした。
0x00000014 の読み取り中 ってどういうことですかね。
メモリのアドレスを表しているのですか。
もしかして、テキストファイルのハンドルが示すアドレスを表しているのでしょうか。
私がデバッグ機能を使えていないからですかね。
勉強しておきます。
エラーが発生した場合、ウィンドウで中断が選べると思いますが、そのときにソース行が表示されるはずです。
この情報から分かるのは、ファイル操作は関係あるのか無いのかも分かりません。
どの行で止まったか。それが必要な情報です。
「アクセス違反をデバッグするには」
https://msdn.microsoft.com/ja-jp/librar ... .120).aspx
すいません。DropBoxのアカウント持っていないのと、ちょっと病気で体力がないので返事ができるのは明日になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 〇〇.exeは動作を停止しました について
load.cppの33行目に
という記述がありました。
sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
によると、sprintf_s関数の第二引数はバッファサイズ、第三引数に書式文字列を指定するべきであるはずですが、
第三引数に0が渡されており、その結果NULLに書式を読みに行くことになり、アクセス違反になる可能性があります。
※実際に動かしたわけではありません。
ここでもsprintf_sではなく、sprintfを使用するように統一するといいと思います。
また、適当にGCCでコンパイルが通るように修正し、実行したところ、タイトル画面が表示され、Zキーを押すと正常終了しました。
実験に使用したソースとバイナリを添付します。(画像は適当なものに差し替えておきました)
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) ダウンロード数: 125 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 〇〇.exeは動作を停止しました について
このファイルはDropBoxのアカウントを持っていなくても、softya(ソフト屋) さんが書きました:DropBoxのアカウント持っていないのと
インターネット環境とディスクの空き容量が十分であり、宗教上の理由(こだわり)が無ければダウンロードできます(できました)。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 〇〇.exeは動作を停止しました について
いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接2次元配列を書いたらできたんですが、
テキストからの読み込みにしたいです。
テキストから読み込むのではなく、
ソースコード内で直接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は動作を停止しました について
worldmapdata_subの大きさが小さいからではないですか?aridai さんが書きました:いま試してみましたが、
テキストから読み込むのではなく、
ソースコード内で直接2次元配列を書いたらできたんですが、
テキストからの読み込みにしたいです。
worldmapdata_sub[12][20]をworldmapdata_sub[15][200]にして同じテストを行うとどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 〇〇.exeは動作を停止しました について
すいません。
わかりました。
ワールドマップは 640pix x 384pix 1マス 32pix x 32pix の規模で、
2次元配列だと [12][20] ですね。ステージ用とワールドマップ用のをごちゃまぜにしていました。
この間もこのようなミスをしていましたし、やっぱ観察力が足りないなと我ながら思います。
ありがとうございました。
わかりました。
ワールドマップは 640pix x 384pix 1マス 32pix x 32pix の規模で、
2次元配列だと [12][20] ですね。ステージ用とワールドマップ用のをごちゃまぜにしていました。
この間もこのようなミスをしていましたし、やっぱ観察力が足りないなと我ながら思います。
ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 〇〇.exeは動作を停止しました について
ミスは誰でも起こるものです。プロもミスします。aridai さんが書きました:すいません。
わかりました。
ワールドマップは 640pix x 384pix 1マス 32pix x 32pix の規模で、
2次元配列だと [12][20] ですね。ステージ用とワールドマップ用のをごちゃまぜにしていました。
この間もこのようなミスをしていましたし、やっぱ観察力が足りないなと我ながら思います。
ありがとうございました。
このようなプログラム構造だとプロもミスしやすいでしょう。
つまり、プログラムの組み方でミスは減らせるので、そう言う工夫を徹底的に行うことで極力ミスを防ぎます。
・直値による誤解を防ぐ。同じ値がプログラムに何度も出てこないようにconst化する。
・変数名により誤解を防ぐ。間違いやすいのは名前に問題がある可能性。あるいはプログラム的に違う名前では扱えないようにガードしてしまう。
・添字が変な値ならないか、プログラムでガードを設ける。
などなどを気をつけてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。