全く訳の分からない例外がスローされてしまいました

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

全く訳の分からない例外がスローされてしまいました

#1

投稿記事 by Ofu » 3年前

下記のようなコード(原因であろう部分のみ上げます)を書いたのですが、「ハンドルされない例外が 0x016307FB (testDX.exe) で発生しました: 0xC0000005: 場所 0x0B6C92BA の読み取り中にアクセス違反が発生しました。」という例外がスローされてしまいました。解決方法が全く分からないので、誰かアドバイスいただけますでしょうか。

コード:

/* WinMain.cpp */
#include "WinMain.h"

//ファイル共用変数宣言

int LoopTime = 0, NowTime = 0;								// ループカウント変数

Color ColorValue;											// 色ハンドル変数

int FontMidium, FontBig;									// フォントハンドル 普通, 大

int MoveCounter;											// 行動カウンタ

// フラグ変数

GameScreen GameS;											// ゲーム状態フラグ変数

PlayBgmFlag BgmFlag = BGM_NULL;								// BGMフラグ定数

int Choose = 0;												// 選択フラグ

// フラグここまで

// ここまで


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	ChangeWindowMode(TRUE);								// ウィンドウモード 

	SetGraphMode(320, 256, 16);							// 画面モード設定 解像度320*256 色ビット16bit

	if (DxLib_Init() == -1) return -1;					// DXライブラリ初期化

	SetDrawScreen(DX_SCREEN_BACK);						// 画像絵画スクリーンセット : バックスクリーン

	// 色々変数セット	

	LoopTime = 0 , NowTime = 0;							// 時刻インプット

	GameS = GAME_TITLE;									// フラグ タイトル処理

	// フォントハンドル
	FontMidium = CreateFontToHandle("FontMidium", 10, 1, DX_FONTTYPE_NORMAL);

	FontBig = CreateFontToHandle("FontBig", 25, 2, DX_FONTTYPE_NORMAL);
	// フォントここまで


	// ここまで

	LoadGameImage();	// 使用画像読み込み

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)	// Windowsからのメッセージ受信 or Escキー押されるまで無限ループ
	{
		MoveCounter %= MOVE_C;					// 行動カウンタ更新

		if (MoveCounter != 0) MoveCounter++;	// 移動カウンタ上げる

		LoopTime++;								// 時間上げる
																	 
		ClearDrawScreen();						// 描画された画像消去

		switch (GameS) {						// ゲーム処理
		case GAME_TITLE:						// タイトル画面処理
			GameTitle();
			break;
		case GAME_MAIN:							// ゲームメイン画面処理
			GameMain();
			break;
		}
		
		ScreenFlip();							// 画面入れ替え

		if (GameS == GAME_END) break;			// ゲーム終了フラグが渡されたとき、無限ループ脱出
		
	}


	DxLib_End();	// DXライブラリ終了処理

	return 0;		// おしまい
}

コード:

/* GameMain.cpp */
#include "GameMain.h"


void GameMain() { // メイン画面

	if(DrawMap() == -1) return; // マップ描画

	MDChara();	// キャラ移動&描画処理
		
	if (BgmFlag != BGM_YaminoDoukutu) { 
		PlaySound("Material\\bgm\\闇の洞窟.wav", DX_PLAYTYPE_LOOP);	// BGM再生
		BgmFlag = BGM_YaminoDoukutu;	// BGMフラグセット
	}

	return;
}


void MDChara(){	// キャラ移動&描画処理

	for (int couX = 0; couX <= ChipX; couX++) {		// 初期化
		for (int couY = 0; couY <= ChipY; couY++) {
			CharaColision[couY][couX] = 0;
		}
	}

	for (int cou = 0;(cou < MaxChara) || (ACharaDataV[cou].living == TRUE); cou++) {
		DrawGraph(ACharaDataV[cou].X*ChipSize - MapC, ACharaDataV[cou].Y*ChipSize - MapC, CharaDataV[ACharaDataV[cou].CharaCode].Graphic[0], TRUE);	// キャラ描画
		CharaColision[ACharaDataV[cou].Y][ACharaDataV[cou].X] = 1;	// 当たり判定
	}

	// 主人公移動処理
	int KeyPut = GetJoypadInputState(DX_INPUT_KEY_PAD1);	// ジョイパッド(操作機器)
	if (MoveCounter == 0) {		// 主人公移動設定
		int pX = ACharaDataV[Shuzinkou].X, pY = ACharaDataV[Shuzinkou].Y;		// 主人公座標変数(仮)	

		if (KeyPut & PAD_INPUT_UP) pY--;		// 上
		if (KeyPut & PAD_INPUT_DOWN) pY++;		// 下
		if (KeyPut & PAD_INPUT_LEFT) pX--;		// 左
		if (KeyPut & PAD_INPUT_RIGHT) pX++;		// 右 

		if (((MapChipV.ColisionDetection[MapData[0][0][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][1][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][2][pY][pX]] != 1))
			&& (CharaColision[pY][pX] != 1) && (pX > 1 && pX < MAP_X && pY > 1 && pY < MAP_Y)) {
			ACharaDataV[Shuzinkou].X = pX, ACharaDataV[Shuzinkou].Y = pY;
			MoveCounter++;
		}
	} // ここまで

	for (int cou = 2; (cou < MaxChara) || (ACharaDataV[cou].living == TRUE); cou++) {	// その他キャラ移動処理
		if (MoveCounter == 15) {
			int pX = ACharaDataV[cou].X, pY = ACharaDataV[cou].Y;				// キャラ座標変数(仮)

			// 方向ランダム割り出し
			srand((unsigned int)LoopTime);

			int Direc = rand() % Direction + 1;
			// ここまで

			switch (Direc) {	// 移動処理
			case CHARADIRECTION_UP:			// 上	
				pY--; break;
			case CHARADIRECTION_DOWN:		// 下
				pY++; break;
			case CHARADIRECTION_LEFT:		// 左
				pX--; break;
			case CHARADIRECTION_RIGHT:		// 右
				pX++; break;
			case CHARADIRECTION_UPLEFT:		// 左上
				pY--; pX--; break;
			case CHARADIRECTION_UPRIGHT:	// 右上
				pY--; pX++; break;
			case CHARADIRECTION_DOWNLEFT:	// 左下
				pY++; pX--; break;
			case CHARADIRECTION_DOWNRIGHT:	// 右下
				pY++; pX++; break;
			}

			if (((MapChipV.ColisionDetection[MapData[0][0][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][1][pY][pX]] != 1) && (MapChipV.ColisionDetection[MapData[0][2][pY][pX]] != 1))
				&& (CharaColision[pY][pX] != 1) && (pX > 1 && pX < MAP_X && pY > 1 && pY < MAP_Y)) {
				ACharaDataV[cou].X = pX; ACharaDataV[cou].Y = pY;
			}
		}
	}

	return;

}



void InitGame() { // ゲームスタート時処理

	int CharaNum = 2;	// キャラ番号

	for (int CountedY = 0; CountedY < ChipY; CountedY++) {			// 主人公位置検査
		for (int CountedX = 0; CountedX < ChipX; CountedX++) {

			int CharaPosition = MapData[0][5][CountedY][CountedX];		// 座標検査

			switch (CharaPosition) {
			case Shuzinkou:		// 主人公処理
				AssignACharaData(Shuzinkou, (CharaCode)CharaPosition,TRUE,CountedX,CountedY);	// 出現キャラデータ代入
				MapData[0][5][CountedY][CountedX] = 0;	// 後始末
				break;
			case BakeTomato:	// モンスターまとめて処理
			case AnaMogura:
			case KazeItachi:
			case Ninzinashi:
			case Gavra:
			case Torrent:
			case Doron:
			case SleepSheep:
			case InoFang:
			case Goblin:
			case TamagoDori:
			case Chimera:
			case Slime:
			case BakeKinoko:
			case DorobouGitsune:
			case HengeDanuki:
			case Kappa:
			case Zimera:
			case KimenIwa:
			case KuroGarasu:
			case Togera:
			case Ghost:
			case Lizard:
			case TitanKids:
			case EvilBat:
			case Goole:
			case Mimic:
			case MadouRobe:
			case Golem:
			case ScullKnight:
			case ArkDragon:
			case Daikonashi:
			case Agra:
			case KamaItachi:
			case BrDoron:
			case HobGoblin:
			case Chimaira:
			case SlimeBes:
			case Toadstool:
			case SaraGyozin:
			case Fantasma:
			case YouganIwa:
			case OrgaKids:
			case DarkBat:
			case Pandora:
			case IronGolem:
			case BinboGami:		// モンスターまとめて処理
				AssignACharaData(CharaNum, (CharaCode)CharaPosition, TRUE, CountedX, CountedY);	// 出現キャラデータ代入
				MapData[0][5][CountedX][CountedY] = 0;	// 後始末
				CharaNum++;
				break;
			}
		}
	}
	return;
}
アドバイスしていただける方、有難うございます。

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

Re: 全く訳の分からない例外がスローされてしまいました

#2

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

まずはデバッガを用いてどこで落ちているかを特定できないですか?

デバッガが使えない、またはデバッガでは特定できない場合、例えばログを出力する関数を用いて、
変数の値やどこを実行したかの情報を得ることで、間違っている場所の特定のヒントになるでしょう。
(いわゆるprintfデバッグ)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: 全く訳の分からない例外がスローされてしまいました

#3

投稿記事 by C6b14 » 3年前

お邪魔します。未実装によるヌルポイインターとかhttp://blog.livedoor.jp/blackwingcat/ar ... 12668.htmlとか?このエラー番号は時々見るような気がします。

C6b14

Re: 全く訳の分からない例外がスローされてしまいました

#4

投稿記事 by C6b14 » 3年前

あ、失礼いたしました。作られているtestDX.exeの0x0B6C92BA の読み取り中にアクセス違反が発生しましたわけですね。ログでトレースして範囲を狭めていく方がいいですね。

C6b14

Re: 全く訳の分からない例外がスローされてしまいました

#5

投稿記事 by C6b14 » 3年前

DxLibが書いてるLog.txtが参考になると思いますが?たしかデフォルトで出してる様な?

inemaru
記事: 108
登録日時: 3年前

Re: 全く訳の分からない例外がスローされてしまいました

#6

投稿記事 by inemaru » 3年前

エラー的に、「配列外アクセス」な気がしますが、
Visual Studioならウォッチ機能等を使用してデバッグするのが速いと思います。

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

Re: 全く訳の分からない例外がスローされてしまいました

#7

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

必要な定義が無いので間違っていると断定はできませんが、GameMain.cppに数点気になる部分がありますね。
  • 22行目のcouX <= ChipXと23行目のcouY <= ChipYという条件式は正しいですか?有効な範囲を1個オーバーしてアクセスしないですか?
  • 28行目と50行目の(cou < MaxChara) || (ACharaDataV[cou].living == TRUE)という条件式は正しいですか?
    この条件ではcouがMaxChara以上になるとACharaDataV[cou]へのアクセスが発生しますが、これは範囲外ではないですか?
    本当にANDではなくORでいいのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Ofu
記事: 11
登録日時: 3年前
連絡を取る:

Re: 全く訳の分からない例外がスローされてしまいました

#8

投稿記事 by Ofu » 3年前

みけCATさん、ありがとうございます、やはり論理演算子を||にしてたのは間違いだったのですね。
ここを&&にしたら何とか直りました。

閉鎖

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