支館の一時停止のプログラムでエラーがでました

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
菜っ葉

支館の一時停止のプログラムでエラーがでました

#1

投稿記事 by 菜っ葉 » 8年前

支館の内容になりますが、そちらの掲示板が無くなっていたのでこちらで質問させていただきます。
始めまして菜っ葉です。

支館の一時停止のプログラムを龍神録プログラミングの館の内容にそって作ったプログラムに書きこんだところ、エラーが表示されました

○○.exeの0x00000000でハンドルされていない例外が発生しました:
0xC00000005: Access violation

というエラーが表示されます

以前にいくつか質問掲示板を見たのですが、
解決策がありませんでした。
どのようにしたらエラーが表示されずに済むのでしょうか?
お願いします。

OSはwindows7で、コンパイラはVisual C++ 2010です。

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

Re: 支館の一時停止のプログラムでエラーがでました

#2

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

支館の内容はよく知りませんが、実行アドレスが0x00000000となっている所を見るとスタックか関数ポインタがNULL or 0クリアされている可能性が高いです。
配列の添字のミスか、ポインタのアドレスが変な所行ったか、こういうバグって取りづらいんですよね。

とりあえず、デバッガでどういうう流れで0x00000000に飛んだか調べてみてください。VC++だと呼び出しブラウザで関数呼び出しの流れがトレースできます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

菜っ葉

Re: 支館の一時停止のプログラムでエラーがでました

#3

投稿記事 by 菜っ葉 » 8年前

softyaさんありがとうございます。

まだ解決してないですけど、とりあえず取り除く方法を教えていただいたことの
お礼という事で返信させていただきました。

呼び出しブラウザで関数呼び出しの流れがトレースできるとはどういうことでしょうか?
その方法を教えてほしいです。

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

Re: 支館の一時停止のプログラムでエラーがでました

#4

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

あっと慌てたので間違いました。すいません。
呼び出し履歴ですね。

「デバッガの使い方」
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html

デバッグ開始でスタートすれば、問題の箇所で止まりますので呼び出し履歴を確認してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

菜っ葉

Re: 支館の一時停止のプログラムでエラーがでました

#5

投稿記事 by 菜っ葉 » 8年前

参考にさせていただきます。

>プログラミングをする上でデバッガの習得は必須事項
と参照サイトにあったので
ちょっと時間をかけて調べようと思います。

時間を割いて詳しく教えてくださってありがとうございました。

また、問題が発生したり^^;
解決した時に、ご報告させていただきます。
その時にこのトピックを解決とさせていただきたいです。

softyaさん
遅くまで失礼しました。
重ねてお詫び、お礼を申し上げます。

アバター
てんむすキツネ
記事: 88
登録日時: 8年前
住所: 岡山

Re: 支館の一時停止のプログラムでエラーがでました

#6

投稿記事 by てんむすキツネ » 8年前

こんにちは
まだまだ初心者のものですが
僕も同じことがおこりました。
そのあと色々やってたら解決策が分かったので一応載せておきます^^
(あなたが求めている答えと違っていたらすみません)

DxLib_end関数は使用した後にreturn 0;を書かなくてはいけません。
(理由はググってください)
しかし、DxLib_end関数を使用しているところは返り値を求めてないのでそれはできません。
なのでfunc_state = 102;として
mainのほうに

コード:

 case 102:
	DxLib_End();//DXライブラリ終了処理
	return 0;
	break;
 
を追加してください。
僕はこれで解決しました。

まだ中学1年なもので国語力が低く、意味がわかりにくいかもしれません。
MLP!MLP!

菜っ葉

Re: 支館の一時停止のプログラムでエラーがでました

#7

投稿記事 by 菜っ葉 » 8年前

返答ありがとうございます。

できればfunc_state = 102;をどこにいれればいいか
教えてもらえると幸いです。

アバター
てんむすキツネ
記事: 88
登録日時: 8年前
住所: 岡山

Re: 支館の一時停止のプログラムでエラーがでました

#8

投稿記事 by てんむすキツネ » 8年前

main.cppなど、変更するところを一通りのせておきますね

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);
    }
}
nain.cppのメインループ変更

コード:

 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;
}

この変更にでは、一時停止のバグをいくつか修正しています。

コード:

  case 1:
			InitSoundMem() ;   //BGMをとめる
            func_state = 0;    //ゲーム初期化
            break;
この、BGMをとめる、というのは最初から再挑戦した際にBGMが前のものとダブって変になるのを防ぐためです。

コード:

if(func_state < 101)
                count++;
このif文は、背景のスクロールの不具合いを直すためです。
MLP!MLP!

菜っ葉

Re: 支館の一時停止のプログラムでエラーがでました

#9

投稿記事 by 菜っ葉 » 8年前

返答ありがとうございました。
おかげで無事、エラーもなく実行させることができました。

閉鎖

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