Debug Assertion Failed!

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

Debug Assertion Failed!

#1

投稿記事 by Tomo » 7年前

蜜柑です。昨日も投稿しましたが今日もエラーに悩んでます。
テキストファイルから読み込んだデータをもとに問題を出題し入力された解答に対して正誤判定を行うというプログラムを作ろうと思っています。
テキストファイルを読み込もうとしてLoadクラスを作って実行しようとしたら起動直後にDebug Assertion Failed!と表示されてしまいました。なぜでしょうか?
添付ファイルに読み込む予定のテキストファイルを載せています。
今回はロードに関するソースコードとそれに伴い変更したコードのみを載せています
その他のファイルはhttp://dixq.net/forum/viewtopic.php?f=3&t=18326に載っています。
環境 windows10,visualstudio2015community,C++,Dxライブラリ使用

以下コードです
StateTransition.h

コード:

#pragma once
#include "ScreenTransition.h"

#include "TitleScreen.h"
#include "ChoiceScreen.h"

#include "Load.h"//一時的

class StateTransition{
private:
	int NowStateNum;
	int BackScreenGh;
	ScreenTransition* screen[4];
	TitleScreen titleS;
	ChoiceScreen choiceS;
	Load* load;//一時的
public:
	StateTransition();
	~StateTransition();
	void Draw();
	void Transition();

};
StateTransition.cpp

コード:

#include "StateTransition.h"
#include "Common.h"//完成後必要ない
#include "Keyboard.h"
#include "DxLib.h"



StateTransition::StateTransition(){
	NowStateNum = 0;
	BackScreenGh= LoadGraph("Graph/backscreen.png");//640*400
	
	screen[0] = &titleS;
	screen[1] = &choiceS;
	load = new Load;
}

void StateTransition::Draw(){
	DrawGraph(0, 0, BackScreenGh, TRUE);
}

void StateTransition::Transition() {
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
		Keyboard::Instance()->Update();
		Draw();
		switch (NowStateNum) {
		case 0:
			screen[0]->Transition();
			if(screen[0]->GetActiveFlag()==false)NowStateNum++;
			break;
		case 1:
			screen[1]->Transition();
			if (screen[1]->GetActiveFlag() == false)NowStateNum++;
			break;
		default:
			//DrawFormatString(320, 150, Color, "%d", NowStateNum);
			load->Draw();
			break;
		}
		//if (Keyboard::Instance()->GetPressingCount(KEY_INPUT_RETURN) == 1)NowStateNum++;
		if (Keyboard::Instance()->GetPressingCount(KEY_INPUT_ESCAPE) != 0)break;
	}
}

StateTransition::~StateTransition(){
}
Load.h

コード:

#pragma once

#define WORD_COUNTS 3000//記憶可能な単語種数
#define WORD_CHARACTERS 16//記憶可能な文字数(単語)
#define SENTENCE_CHARACTERS 64//記憶可能な文字数(文章)

class Load{
private:
	int FileHandle;
	int Case;
	int Now;
	int Input[128];
	char InputBuf[128];
	char WordJa[3][WORD_COUNTS][WORD_CHARACTERS];
	char WordEn[WORD_COUNTS][WORD_CHARACTERS];
	char sentenceQ[WORD_COUNTS][SENTENCE_CHARACTERS];
	char sentenceA[WORD_COUNTS][SENTENCE_CHARACTERS];
	char Answer[WORD_COUNTS][5][WORD_CHARACTERS];

public:
	Load();
	~Load();
	void LoadData();
	void Draw();
};
Load.cpp

コード:

#include "Load.h"
#include "DxLib.h"
#include "Common.h"

Load::Load(){
	Case = 0;
	Now = 0;
	FileHandle= FileRead_open("Load/Data.txt");
}


void Load::LoadData(){
	while (FileRead_getc(FileHandle) != '\n');
	int i = 0, j = 0, count = 0, AnsNum = 0;
	while (Input[i] != EOF) {
		for (i = 0;i < 128;i++) {
			InputBuf[i] = Input[i] = FileRead_getc(FileHandle);
			if (Input[i] == '/' || Input[i] == '\n') {
				InputBuf[i] = '\0';
				break;
			}
		}
		switch (Case) {
		case 0:strcpy_s(WordEn[Now], InputBuf);
			break;
		case 1:strcpy_s(WordJa[0][Now], InputBuf);
			break;
		case 2:strcpy_s(WordJa[1][Now], InputBuf);
			break;
		case 3:strcpy_s(WordJa[2][Now], InputBuf);
			break;
		case 4:strcpy_s(sentenceA[Now], InputBuf);
			while (sentenceA[Now][j] != '\0') {
				if (sentenceA[Now][j] == '[') {
					while (sentenceA[Now][j] != ']') {
						count++;
						Answer[Now][AnsNum][count - 1] = sentenceA[Now][j + count];
						sentenceA[Now][j + count] = ' ';
					}
					AnsNum++;
				}
				j++;
			}
		case 5:strcpy_s(sentenceQ[Now], InputBuf);
			break;
		}
		Case++;
		if (Case == 6) {
			Case = 0;
			Now++;
			count = 0;
			AnsNum = 0;
			j = 0;
		}
	}
	FileRead_close(FileHandle);
}

void Load::Draw(){
	DrawFormatString(40, 90, Color, "WordEn[0]=%s", WordEn[0]);
	DrawFormatString(40, 90, Color, "WordJa[0]=%s", WordJa[0]);
	DrawFormatString(40, 90, Color, "WordJa[1]=%s", WordJa[1]);
	DrawFormatString(40, 90, Color, "WordJa[2]=%s", WordJa[2]);
	DrawFormatString(40, 90, Color, "WordJa[0]=%s", WordEn[0]);
	DrawFormatString(40, 90, Color, "sentenceA[0]=%s", sentenceA[0]);
	DrawFormatString(40, 90, Color, "sentenceQ[0]=%s", sentenceQ[0]);

}


Load::~Load(){

}

main.cpp

コード:

#include <DxLib.h>
#include "Common.h"
#include "Load.h"
#include "StateTransition.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	SetGraphMode(WIDTH, HEIGHT, BITS);
	SetMainWindowText(TITLE);
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);
	SetAlwaysRunFlag(TRUE);
	ChangeFont("游明朝");

	Load* load = new Load;
	load->LoadData();
	{
		StateTransition st;
		st.Transition();
	}

	DxLib_End();
	delete load;
	return 0;
}
添付ファイル
Data.txt
読み込まれるテキストファイルです
(225 バイト) ダウンロード数: 97 回

box
記事: 2002
登録日時: 13年前

Re: Debug Assertion Failed!

#2

投稿記事 by box » 7年前

ちゃんと追いかけたわけではないですが…
蜜柑 さんが書きました:

コード:

	while (Input[i] != EOF) {
		for (i = 0;i < 128;i++) {
変数 i の値を上書きしているのがとても気になります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: Debug Assertion Failed!

#3

投稿記事 by YuO » 7年前

assertの表明失敗であれば,失敗した式やソースファイル名,行番号が書かれているはずです。
あとは,呼び出し履歴辿って変数の値が想定通りか調べていけばよいと思うのですが。

参考:過去に書いた,この手のバグに対するデバッグの導入部分
http://dixq.net/forum/viewtopic.php?f=3&t=17999#p138073

Tomo
記事: 16
登録日時: 9年前
住所: 埼玉県

Re: Debug Assertion Failed!

#4

投稿記事 by Tomo » 7年前

boxさんYuOさんありがとうございます。
アドバイスを参考に履歴をたどってみます。
また何かあったら質問させていただきます。

Tomo
記事: 16
登録日時: 9年前
住所: 埼玉県

Re: Debug Assertion Failed!

#5

投稿記事 by Tomo » 7年前

http://dixq.net/forum/viewtopic.php?f=3 ... 50#p139650
こちらで解決しました。
ソースコードをがらりと変えてしまったのでboxさんには明確な返答ができずすみません。
呼び出し履歴を読みましたが今回のエラーはデバッグしてメモリエラーが起きていたのが理解できましたが解決には至りませんでした。
しかし解決したことによってデバッグの有用性が身に染みて理解できました。次回からはもう少し粘れそうです
改めてboxさんYuOさんありがとうございました。

閉鎖

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