支館の内容になりますが、そちらの掲示板が無くなっていたのでこちらで質問させていただきます。
始めまして菜っ葉です。
支館の一時停止のプログラムを龍神録プログラミングの館の内容にそって作ったプログラムに書きこんだところ、エラーが表示されました
○○.exeの0x00000000でハンドルされていない例外が発生しました:
0xC00000005: Access violation
というエラーが表示されます
以前にいくつか質問掲示板を見たのですが、
解決策がありませんでした。
どのようにしたらエラーが表示されずに済むのでしょうか?
お願いします。
OSはwindows7で、コンパイラはVisual C++ 2010です。
支館の一時停止のプログラムでエラーがでました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 支館の一時停止のプログラムでエラーがでました
支館の内容はよく知りませんが、実行アドレスが0x00000000となっている所を見るとスタックか関数ポインタがNULL or 0クリアされている可能性が高いです。
配列の添字のミスか、ポインタのアドレスが変な所行ったか、こういうバグって取りづらいんですよね。
とりあえず、デバッガでどういうう流れで0x00000000に飛んだか調べてみてください。VC++だと呼び出しブラウザで関数呼び出しの流れがトレースできます。
配列の添字のミスか、ポインタのアドレスが変な所行ったか、こういうバグって取りづらいんですよね。
とりあえず、デバッガでどういうう流れで0x00000000に飛んだか調べてみてください。VC++だと呼び出しブラウザで関数呼び出しの流れがトレースできます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 支館の一時停止のプログラムでエラーがでました
softyaさんありがとうございます。
まだ解決してないですけど、とりあえず取り除く方法を教えていただいたことの
お礼という事で返信させていただきました。
呼び出しブラウザで関数呼び出しの流れがトレースできるとはどういうことでしょうか?
その方法を教えてほしいです。
まだ解決してないですけど、とりあえず取り除く方法を教えていただいたことの
お礼という事で返信させていただきました。
呼び出しブラウザで関数呼び出しの流れがトレースできるとはどういうことでしょうか?
その方法を教えてほしいです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 支館の一時停止のプログラムでエラーがでました
あっと慌てたので間違いました。すいません。
呼び出し履歴ですね。
「デバッガの使い方」
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
デバッグ開始でスタートすれば、問題の箇所で止まりますので呼び出し履歴を確認してください。
呼び出し履歴ですね。
「デバッガの使い方」
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
デバッグ開始でスタートすれば、問題の箇所で止まりますので呼び出し履歴を確認してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 支館の一時停止のプログラムでエラーがでました
参考にさせていただきます。
>プログラミングをする上でデバッガの習得は必須事項
と参照サイトにあったので
ちょっと時間をかけて調べようと思います。
時間を割いて詳しく教えてくださってありがとうございました。
また、問題が発生したり^^;
解決した時に、ご報告させていただきます。
その時にこのトピックを解決とさせていただきたいです。
softyaさん
遅くまで失礼しました。
重ねてお詫び、お礼を申し上げます。
>プログラミングをする上でデバッガの習得は必須事項
と参照サイトにあったので
ちょっと時間をかけて調べようと思います。
時間を割いて詳しく教えてくださってありがとうございました。
また、問題が発生したり^^;
解決した時に、ご報告させていただきます。
その時にこのトピックを解決とさせていただきたいです。
softyaさん
遅くまで失礼しました。
重ねてお詫び、お礼を申し上げます。
Re: 支館の一時停止のプログラムでエラーがでました
こんにちは
まだまだ初心者のものですが
僕も同じことがおこりました。
そのあと色々やってたら解決策が分かったので一応載せておきます^^
(あなたが求めている答えと違っていたらすみません)
DxLib_end関数は使用した後にreturn 0;を書かなくてはいけません。
(理由はググってください)
しかし、DxLib_end関数を使用しているところは返り値を求めてないのでそれはできません。
なのでfunc_state = 102;として
mainのほうに を追加してください。
僕はこれで解決しました。
まだ中学1年なもので国語力が低く、意味がわかりにくいかもしれません。
まだまだ初心者のものですが
僕も同じことがおこりました。
そのあと色々やってたら解決策が分かったので一応載せておきます^^
(あなたが求めている答えと違っていたらすみません)
DxLib_end関数は使用した後にreturn 0;を書かなくてはいけません。
(理由はググってください)
しかし、DxLib_end関数を使用しているところは返り値を求めてないのでそれはできません。
なのでfunc_state = 102;として
mainのほうに を追加してください。
僕はこれで解決しました。
まだ中学1年なもので国語力が低く、意味がわかりにくいかもしれません。
MLP!MLP!
Re: 支館の一時停止のプログラムでエラーがでました
main.cppなど、変更するところを一通りのせておきますね
cintrol.cpp game_stop関数変更
nain.cppのメインループ変更
この変更にでは、一時停止のバグをいくつか修正しています。
この、BGMをとめる、というのは最初から再挑戦した際にBGMが前のものとダブって変になるのを防ぐためです。
このif文は、背景のスクロールの不具合いを直すためです。
cintrol.cpp game_stop関数変更
void game_stop()
{
int s;
// constでデータが書き換わらないようにする
const char *str[] =
{
{"ゲームに戻る"},
{"最初から始める"},
{"タイトルへ戻る"},
{"終了する"},
{"NULL"} // NULL文字列で終了を示す(小文字不可)
};
static int menu;
MenuDraw( FX+FMX/2 , FY+FMY/3 , "一時停止" , str, menu );
if( CheckStatePad(configpad.shot) == 1 )
{
switch(menu)
{
case 0:
func_state = 100; //メインに戻る
break;
case 1:
InitSoundMem() ; //BGMをとめる
func_state = 0; //ゲーム初期化
break;
case 2:
func_state = 100; //タイトルへ
break;
case 3:
func_state = 102; //ゲームを終える
break;
default:
printfDx("不明なメニューが選択されました ");
break;
}
menu=0;
DeleteGraph(img_screen);
}
}
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
fantasy_check();
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
case 101://一時停止
DrawGraph(0, 0, img_screen, FALSE);
break;
case 102:
DxLib_End();//DXライブラリ終了処理
return 0;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
control_main();
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
ScreenFlip();//裏画面反映
if(func_state < 101)
count++;
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
MLP!MLP!