ハンドルされていない例外

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

ハンドルされていない例外

#1

投稿記事 by SDD » 9年前

立て続けにすみません、何度か質問させていただいているSDDです。
今回はハンドルされていない例外という問題に困ったため、質問させていただきます。


似たような質問があるかもと思ったのですが、トピックを調べてみてもなかなか解決しないため
改めてトピックを立てました。

環境
WIN7
VC++2008EE
DXライブラリ

初心者です。

龍神録を参考にしながらC++で勉強がてらにシューティングゲームを作ろうと思っているのですが、
上記のメッセージが出て困っております。

まだ、とりあえずのラフスケッチのようなコードですが、EnemyControlというクラスのメンバのMake_Enemy()で
CSVを読み込み、敵オブジェクトを生成しています。

コード:

class Enemy{
private:
	EnemyData teki;
	int gh;
	void Move(){}
public:
	void All();
	Enemy(int cnt,int pattern,int knd,double x,double y,double sp,int bltime,int blknd,int col,
		int hp,int blknd2,int wait,int *item_n);//敵データ初期化などのコンストラクタ
};


class EnemyControl{
private:
	//敵オブジェクトのポインタ
	Enemy *enemy[ENEMY_NUM];
public:
	void Make_Enemy();//CSVデータ読み込み、敵オブジェクト生成など
	void All();
};


Enemy::Enemy(int cnt,int pattern,int knd,double x,double y,double sp,int bltime,int blknd,int col,
		int hp,int blknd2,int wait,int *item_n){ 	
	teki.cnt=cnt;
	teki.pattern=pattern;
	teki.knd=knd;
	teki.x=x;
	teki.y=y;
	teki.sp=sp;
	teki.bltime=bltime;
	teki.blknd=blknd;
	teki.col=col;
	teki.hp=hp;
	teki.blknd2=blknd2;
	teki.wait=wait;
	for(int i=0;i<6;i++){
		teki.item_n[i]=item_n[i];
	}
}

void Enemy::All(){
	DrawGraph(teki.x,teki.y,gh,TRUE);
}




void EnemyControl::Make_Enemy(){
	EnemyData data[ENEMY_NUM];
	int n,num,i,fp;
	char fname[]={"story1.csv"};
	int input[64];
	char inputc[64];

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	for(i=0;i<2;i++)//最初の2行読み飛ばす
		while(FileRead_getc(fp)!='\n');

	n=0 , num=0;
	while(1){
		for(i=0;i<64;i++){
			inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
			if(inputc[i]=='/'){//スラッシュがあれば
				while(FileRead_getc(fp)!='\n');//改行までループ
				i=-1;//カウンタを最初に戻して
				continue;
			}
			if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
				inputc[i]='\0';//そこまでを文字列とし
				break;
			}
			if(input[i]==EOF){//ファイルの終わりなら
				goto EXFILE;//終了
			}
		}
		switch(num){
						case 0: data[n].cnt      =atoi(inputc);break;
						case 1: data[n].pattern  =atoi(inputc);break;
						case 2: data[n].knd      =atoi(inputc);break;
						case 3: data[n].x        =atof(inputc);break;
						case 4: data[n].y        =atof(inputc);break;
						case 5: data[n].sp       =atof(inputc);break;
						case 6: data[n].bltime   =atoi(inputc);break;
						case 7: data[n].blknd    =atoi(inputc);break;
						case 8: data[n].col      =atoi(inputc);break;
						case 9: data[n].hp       =atoi(inputc);break;
						case 10:data[n].blknd2   =atoi(inputc);break;
						case 11:data[n].wait     =atoi(inputc);break;
						case 12:data[n].item_n[0]=atoi(inputc);break;
						case 13:data[n].item_n[1]=atoi(inputc);break;
						case 14:data[n].item_n[2]=atoi(inputc);break;
						case 15:data[n].item_n[3]=atoi(inputc);break;
						case 16:data[n].item_n[4]=atoi(inputc);break;
						case 17:data[n].item_n[5]=atoi(inputc);break;
		}
		num++;
		if(num==18){
			num=0;
			n++;
		}
	}
EXFILE:
	FileRead_close(fp);

	//敵オブジェクト生成
	for(int i=0;i<ENEMY_NUM;i++){
		enemy[i]=new Enemy(data[n].cnt,data[n].pattern,data[n].knd,data[n].x,
			data[n].y,data[n].sp,data[n].bltime,data[i].blknd,data[n].col,
			data[n].hp,data[n].blknd2,data[n].wait,data[n].item_n);
	}
}




void EnemyControl::All(){
	for(int i=0;i<ENEMY_NUM;i++){
		enemy[i]->All();
	}
}

エラーは起きないのですが、実行すると、ハンドルされていない例外のメッセージが出てきて停止します。
プログラムを中断すると、Enemyのコンストラクタでとまります。そこに問題があるということなんででしょうか。
呼び出し履歴をみてもよくわからず、悩んでいます。

稚拙な質問かも知れませんが、アドバイスをいただきたいと思い、質問させていただきました。
どうかよろしくお願いします。

アバター
へにっくす
記事: 634
登録日時: 12年前
住所: 東京都

Re: ハンドルされていない例外

#2

投稿記事 by へにっくす » 9年前

敵オブジェクト生成でdata[n]になってますが、このnってどうなってますか。
dataじゃないの?(なんでblkndだけdataになってんだか知らんけど)

コード:

    //敵オブジェクト生成
    for(int i=0;i<ENEMY_NUM;i++){
        enemy[i]=new Enemy(data[n].cnt,data[n].pattern,data[n].knd,data[n].x,
            data[n].y,data[n].sp,data[n].bltime,data[i].blknd,data[n].col,
            data[n].hp,data[n].blknd2,data[n].wait,data[n].item_n);
    }
written by へにっくす

SDD

Re: ハンドルされていない例外

#3

投稿記事 by SDD » 9年前

本当ですね。うっかりしていました。
訂正して、dataにしましたが、まだ解決できないようです。
他に原因があるのでしょうか。考えたのですが、どうにも難しいです。

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

Re: ハンドルされていない例外

#4

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

デバッガで止まるなら、その行で問題にひっかかっています。
全ソースコードが有るわけでないので、想像でしか答えられませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#5

投稿記事 by SDD » 9年前

中断するとコンストラクタの最後の行を緑色の矢印が指しています。

コード:


Enemy::Enemy(int cnt,int pattern,int knd,double x,double y,double sp,int bltime,int blknd,int col,
		int hp,int blknd2,int wait,int *item_n){ 	
	teki.cnt=cnt;
	teki.pattern=pattern;
	teki.knd=knd;
	teki.x=x;
	teki.y=y;
	teki.sp=sp;
	teki.bltime=bltime;
	teki.blknd=blknd;
	teki.col=col;
	teki.hp=hp;
	teki.blknd2=blknd2;
	teki.wait=wait;
	for(int i=0;i<6;i++){
		teki.item_n[i]=item_n[i];
	}
}//ここを指している
これはどういうことなんでしょうか。質問ばかりですみません。


またメインループ内はこんな感じです。

コード:



	while(ProcessLoop()==0 ){
		switch(gstate){
			case GAME_TITLE:
				drawGameTitle();
				fps.draw_fps(0,100);
				break;
			case GAME_SENTAKU:
				drawGameSentaku();
				fps.draw_fps(0,100);
				enemycont.Make_Enemy();//ここで使用
				break;
			case GAME_MAIN:
				drawGameMain();
				enemycont.All();//ここで使用
				fps.draw_fps(0,100);
				break;
			case GAME_OVER:
				drawGameOver();
				break;

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

Re: ハンドルされていない例外

#6

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

一番ありそうなのはteki.item_nのnew忘れとかなんですよね。
再現可能なミニマムコードがあると答えやすいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#7

投稿記事 by SDD » 9年前

softya(ソフト屋)さん、ありがとうございます。

配列は数が決まっているため、動的確保していないのですが、
こういう場合はnewが必要なのでしょうか。もしそうなら原因はおそらくそれかもしれません。
new忘れというのはどのようなタイミングでnewを使っていなければいけないのでしょうか。

只今手元にコードがないのですが、普通に構造体の定義の部分で

int item_n[6];//落とすアイテム

と言う風に定義しているだけな感じです。

毎度すみません。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: ハンドルされていない例外

#8

投稿記事 by zxc » 9年前

コード:

    for(int i=0;i<6;i++){
        teki.item_n[i]=item_n[i];
    }
  Enemyクラスのコンストラクタにおける上のようなコードで範囲外アクセスが起きていませんか?
  teki.item_n,item_nの両方の配列数が6以上であることが確実だと言えますか?
  もしくはこの部分に関するコードのコメントアウトなどで、エラーがなくなるかどうか試すことは出来ますか?

  とりあえずこの「6」という数字が何度もitem_nについて登場するのならば、それを変数やマクロに定義し、マジックナンバー的表記を避けるべきだと思います。

SDD

Re: ハンドルされていない例外

#9

投稿記事 by SDD » 9年前

zxcさん、ご協力ありがとうございます。
さっきの私のレスで書き忘れていたのですが、アイテム関係を一切消したところ(CSV、引数など)
、そのエラーメッセージはでなくなりました。
ですからソフト屋さんやzxcさんが仰るように、どうやらアイテム周りに問題があるようです。

しばらく調べてみます。
参考にさせていただきます。

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

Re: ハンドルされていない例外

#10

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

どちらかと言うとnewした方が危険です。
私は失敗したのかな?と予測しただけですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#11

投稿記事 by SDD » 9年前

一応、龍神録さんから抜粋して簡単に試せるコードを作りました。

コード:

#include "DxLib.h"



#define ENEMY_NUM 5



struct EnemyData{
	int flag;  //フラグ
	int cnt;   //カウンタ
	int pattern;//移動パターン
	int knd;    //種類
	int hp;     //HP
	int hp_max; //HP最大値
	int item_n[6];//落とすアイテム
	//int back_col;

	//座標、速度x,y成分、角度
	double x,y,vx,vy,sp,ang;
	//弾幕開始時間、弾幕の種類、弾の種類、色、状態、待機時間、停滞時間
	int    bltime,blknd,blknd2,col,state,wtime,wait;
};





class Enemy{
private:
	EnemyData teki;
	int gh;
	void Move(){}
public:
	void All();
	Enemy(int cnt,int pattern,int knd,double x,double y,double sp,int bltime,int blknd,int col,
		int hp,int blknd2,int wait,int *item_n);//敵データ初期化などのコンストラクタ
};


class EnemyControl{
private:
	//敵オブジェクトのポインタ
	Enemy *enemy[ENEMY_NUM];
public:
	void Make_Enemy();//CSVデータ読み込み、敵オブジェクト生成など
	void All();
};




Enemy::Enemy(int cnt,int pattern,int knd,double x,double y,double sp,int bltime,int blknd,int col,
			 int hp,int blknd2,int wait,int *item_n){ 	
				 teki.cnt=cnt;
				 teki.pattern=pattern;
				 teki.knd=knd;
				 teki.x=x;
				 teki.y=y;
				 teki.sp=sp;
				 teki.bltime=bltime;
				 teki.blknd=blknd;
				 teki.col=col;
				 teki.hp=hp;
				 teki.blknd2=blknd2;
				 teki.wait=wait;
				 for(int i=0;i<6;i++){
					 teki.item_n[i]=item_n[i];
				 }
}

void Enemy::All(){
	DrawGraph(teki.x,teki.y,gh,TRUE);
}




void EnemyControl::Make_Enemy(){
	EnemyData data[ENEMY_NUM];
	int n,num,i,fp;
	char fname[]={"story1.csv"};
	int input[64];
	char inputc[64];

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	for(i=0;i<2;i++)//最初の2行読み飛ばす
		while(FileRead_getc(fp)!='\n');

	n=0 , num=0;
	while(1){
		for(i=0;i<64;i++){
			inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
			if(inputc[i]=='/'){//スラッシュがあれば
				while(FileRead_getc(fp)!='\n');//改行までループ
				i=-1;//カウンタを最初に戻して
				continue;
			}
			if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
				inputc[i]='\0';//そこまでを文字列とし
				break;
			}
			if(input[i]==EOF){//ファイルの終わりなら
				goto EXFILE;//終了
			}
		}
		switch(num){
						case 0: data[n].cnt      =atoi(inputc);break;
						case 1: data[n].pattern  =atoi(inputc);break;
						case 2: data[n].knd      =atoi(inputc);break;
						case 3: data[n].x        =atof(inputc);break;
						case 4: data[n].y        =atof(inputc);break;
						case 5: data[n].sp       =atof(inputc);break;
						case 6: data[n].bltime   =atoi(inputc);break;
						case 7: data[n].blknd    =atoi(inputc);break;
						case 8: data[n].col      =atoi(inputc);break;
						case 9: data[n].hp       =atoi(inputc);break;
						case 10:data[n].blknd2   =atoi(inputc);break;
						case 11:data[n].wait     =atoi(inputc);break;
						case 12:data[n].item_n[0]=atoi(inputc);break;
						case 13:data[n].item_n[1]=atoi(inputc);break;
						case 14:data[n].item_n[2]=atoi(inputc);break;
						case 15:data[n].item_n[3]=atoi(inputc);break;
						case 16:data[n].item_n[4]=atoi(inputc);break;
						case 17:data[n].item_n[5]=atoi(inputc);break;
		}
		num++;
		if(num==18){
			num=0;
			n++;
		}
	}
EXFILE:
	FileRead_close(fp);

	//敵オブジェクト生成
	for(int i=0;i<ENEMY_NUM;i++){
		enemy[i]=new Enemy(data[i].cnt,data[i].pattern,data[i].knd,data[i].x,
			data[i].y,data[i].sp,data[i].bltime,data[i].blknd,data[i].col,
			data[i].hp,data[i].blknd2,data[i].wait,data[i].item_n);
	}
}




void EnemyControl::All(){
	for(int i=0;i<ENEMY_NUM;i++){
		enemy[i]->All();
	}
}




int func_state;


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	//敵管理オブジェクト
	EnemyControl enemycont;

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		switch(func_state){
			case 0:
				//データロード
				enemycont.Make_Enemy();//ここで使用
				func_state=99;
				break;
			case 99://STGを始める前に行う初期化
				enemycont.All();//ここで使用
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}

		if(CheckHitKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}
読み込むCSVは
/カウンタ,移動パターン,敵の種類,x座標,y座標,スピード,発射時間,弾幕種類,弾の色,体力,弾種類,待機時間,アイテム1,2,3,4,5,6
/cnt,pattern,knd,x,y,sp,bltime,blknd,col,hp,blknd2,wait,item_n,,,,,
100,2,1,150,-20,0,60,0,1,50,1,120,0,-1,-1,-1,-1,-1
120,2,0,180,-20,0,60,0,2,50,1,120,2,-1,-1,-1,-1,-1
140,2,1,210,-20,0,60,0,1,50,1,120,2,-1,-1,-1,-1,-1
160,2,0,240,-20,0,60,0,2,50,1,120,0,-1,-1,-1,-1,-1
190,2,1,270,-20,0,60,0,1,50,1,120,-1,-1,-1,-1,-1,-1
という風になってます。

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

Re: ハンドルされていない例外

#12

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

読み込み時にEnemyData data[ENEMY_NUM];のENEMY_NUMを超えている様です(そこまでしかチェックしてません)
スタック系が破壊されるので何が起こっても不思議じゃないです。
自分を信用せずENEMY_NUMを超えたらエラーになるようにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#13

投稿記事 by SDD » 9年前

設定した敵の数を上回ってロードしてしまっているということですか?
それが今回のことの原因なのでしょうか・・・。

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

Re: ハンドルされていない例外

#14

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

SDD さんが書きました:設定した敵の数を上回ってロードしてしまっているということですか?
それが今回のことの原因なのでしょうか・・・。
データブレークやらアセンブラ・レベルで色々調べれば分かりますが、すごく時間がかかるんで今やる価値の有ることとは思えません。
調べたいのならご自身で頑張っていただくしか無いですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#15

投稿記事 by SDD » 9年前

目に見えてわかるようなミスではないのでしょうか。
龍神録を参考に作ったときはこんなことにはならなかったのですが・・・。
正直、どうしたらいいか全く検討がつきません。
データブレークというものを使って、どのような風にミスがわかるのでしょうか

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

Re: ハンドルされていない例外

#16

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

派生的な「中断するとコンストラクタの最後の行を緑色の矢印が指しています。」を調べるのは大変と言うことです。
データ件数のオーバーは、Make_Enemyをステップ実行して予定数をオーバーしている原因を調べるだけです。
この読み込み処理のコード理解されているんですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#17

投稿記事 by SDD » 9年前

前者の、矢印のことだけではエラーの詳細を判断するには大雑把で曖昧すぎるということでしょうか。

すみません、大変恥ずかしいのですが、その読み込み処理に関しての理解度は
正直に言うと微妙で、具体的に言いますと、「大体わかるけど、では何も見ずに書いてみろと言われたら難しい」という具合です。
まず、ここの理解も深めることにします。

ただ、今回の問題も同時にクリアしたいです。

ステップ実行をして、まず自分で調べてみます。

ただ、お伺いしたいのですが、「読み込み時にEnemyData data[ENEMY_NUM];のENEMY_NUMを超えている」
とのことですが、それはどうしてわかったのでしょうか。今後のために聞いておきたいです。

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

Re: ハンドルされていない例外

#18

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

勘です。
・・・だけだと、あんまりなので推測です。

デバッガで訳の分からないアドレスでエラーが出る
 ↓
大抵スタックが破壊されている。
 ↓
ローカル変数で配列の有る所が怪しい。
 ↓
読み込み処理がバグりやすい
 ↓
EnemyData data[ENEMY_NUM];かな?
 ↓
デバッガで添字を確認
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SDD

Re: ハンドルされていない例外

#19

投稿記事 by SDD » 9年前

なるほど、わかりました。
ちゃんと自分でしらべてみます。
今、調べているところです。(ロード処理の仕組みも目で追っています)

しばらく粘ってみます。

SDD

Re: ハンドルされていない例外

#20

投稿記事 by SDD » 9年前

調べてみたところ、nが7(n==6)にまでなっていたことがわかりました。
そのため、ためしにとりあえずENEMEY_NUMを7にしたところ、無事うごきました。

やはり、ロード関数に問題があるようです。
まず、そこを考えます。

おかげさまで取り合えず一歩目の問題は分かりました。
もう少し粘ってみます。

申し訳ありませんが、念のため、まだ解決にはしません。
また、自力で解決できた際には、ルール通り、どのように解決したかを記させていただきます。

SDD

Re: ハンドルされていない例外

#21

投稿記事 by SDD » 9年前

連投すみません。
ずっと調べていたのですが、ためしにCSVのデータを打ち直してみたら、nの回数は正しくなって、メッセージもなくなり、ちゃんとオブジェクトの生成も働くようになったのですが
(エクセルを持っていないため、テキストエディタで作っていたため、変な入力をしてたのだろうか。テキスト直したら直ったというのも少し不安ですが。)
最後の最後のdata[4].item_n[5]に格納された数値だけがめちゃくちゃなまま、処理が進んでしまっているようです。
[0] = -1
[1] = -1
[2] = -1
[3] = -1
[4] = -1
[5] = -858993460
といった具合です。-1が正しいのですが。

引き続き、調べたいと思うのですが、もしアドバイスやなにか思ったことがありましたら、教えていただきたいです。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: ハンドルされていない例外

#22

投稿記事 by zxc » 9年前

  dataは構造体でしょうか。dataが構造体かクラスなら、コンストラクタのときに初期化リスト等で初期値を与えましたか?なんとなくですが、その値はゴミ(初期値を与えないときに入っている適当な値)なんじゃないかと思います。


  そうであれば、csvファイルに値が十分な個数あるのか、その値を必要なだけ読み取って利用できるようになっているのか、利用する段階できちんと初期化/代入などにその値を全て使っているかを、カウントしてみる。もしくはハッシュ値で整合性を確かめる等、どこでファイルのデータ値が変数に想定どおりの形で入らなくなったのかを調べればいいと思います。読み取られるファイルのコンマや空白が全角かどうか、tabは入っているか等もファイル読み取りの実装によっては影響しているのかもしれません。
  

SDD

Re: ハンドルされていない例外

#23

投稿記事 by SDD » 9年前

zxcさん、ご協力ありがとうございます。
構造体です。今、一応構造体のコンストラクタで0で初期化するようにしました。

想定どおりの値が入らなくなったのは、data[4].item_n[5]の、最後の一つだけです。他のdata[0]~[4].item_n[0]~[4]のすべてに理想値が
入っているのですが・・・。

Ryo

Re: ハンドルされていない例外

#24

投稿記事 by Ryo » 9年前

CSVファイルが

(data)
(data)
(data)<EOF>

(data)
という状態になっていると思います(イメージ)

(data)
(data)
<EOF>

となるように、最後の行にも改行をいれてみてください

Ryo

Re: ハンドルされていない例外

#25

投稿記事 by Ryo » 9年前

すいません、4個目(「という~」の上)のdataは書き損じです
完全に無視してください

SDD

Re: ハンドルされていない例外

#26

投稿記事 by SDD » 9年前

Ryoさん、ご協力ありがとうございます。


Ryoさんに教えていただいたように、CSVの最後の行が問題だったようです。
私の、テキストエディタによるCSVの編集ミスのため、EOFを間違えて認識していたようです。

教えていただいたようにしたら解決できました!
デバッガを使って最後まで配列に格納されているのも確認しました。
本当に助かりました。


また、ちゃんとENEMY_NUMを超えたらエラーをはくようにします。

協力していただいた、Ryoさん、ソフト屋さん、zxcさん、へにっくすさん、ありがとうございました!

閉鎖

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