Pause=Downとなるバグ

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

Pause=Downとなるバグ

#1

投稿記事 by amehirune » 9年前

お久しぶりです。今回も質問させていただきます。

これは、ポーズの完全実装に踏み切り、パットでの対応をさせようとしたときに起きたエラーです。
具体的には、
・下キーを押すとポーズがかかり、同時に下への入力判定がオンになる
・Pキー(ポーズのキーボード対応位置)を押すとポーズがかかり、同時に下への入力判定がオンになる
・パットに対応していない
の3つです。

ずっと考えていましたが、何が悪いのかわかりません。なにとぞご教授をお願いいたします。

struct.h

コード:

//パッドに関する構造体
typedef struct{
	int key[PAD_MAX];
}pad_t;
//コンフィグに関する構造体
typedef struct{
	int left,up,right,down,shot,bom,slow,start,change,pause;
}configpad_t;
ini.cpp

コード:

	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:	configpad.down	=atoi(inputc);break;
			case 1:	configpad.left	=atoi(inputc);break;
			case 2:	configpad.right	=atoi(inputc);break;
			case 3: configpad.up	=atoi(inputc);break;
			case 4:	configpad.bom	=atoi(inputc);break;
			case 5:	configpad.shot	=atoi(inputc);break;
			case 6:	configpad.slow	=atoi(inputc);break;
			case 7:	configpad.start	=atoi(inputc);break;
			case 8:	configpad.pause	=atoi(inputc);break;

		}
		num++;
	}
EXFILE:
	FileRead_close(fp);
key.cpp

コード:

void GetHitPadStateAll(){
	int i,PadInput,mul=1;
	PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
	for(i=0;i<16;i++){
		if(PadInput & mul)	pad.key[i]++;
		else				pad.key[i]=0;
		mul*=2;
	}
	input_pad_or_key(&pad.key[configpad.left]	,CheckStateKey(KEY_INPUT_LEFT	 ));
	input_pad_or_key(&pad.key[configpad.up]	    ,CheckStateKey(KEY_INPUT_UP	     ));
	input_pad_or_key(&pad.key[configpad.right]  ,CheckStateKey(KEY_INPUT_RIGHT	 ));
	input_pad_or_key(&pad.key[configpad.down]	,CheckStateKey(KEY_INPUT_DOWN	 ));
	input_pad_or_key(&pad.key[configpad.shot]	,CheckStateKey(KEY_INPUT_Z	     ));
	input_pad_or_key(&pad.key[configpad.bom]	,CheckStateKey(KEY_INPUT_X		 ));
	input_pad_or_key(&pad.key[configpad.slow]	,CheckStateKey(KEY_INPUT_LSHIFT	 ));
	input_pad_or_key(&pad.key[configpad.start]  ,CheckStateKey(KEY_INPUT_S		 ));
	input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
	input_pad_or_key(&pad.key[configpad.pause]	,CheckStateKey(KEY_INPUT_P		 ));
}
main.cpp

コード:

if(CheckStatePad(configpad.pause)==1)	func_state=101;//Pキーで簡易型ポーズの実装
pad.csv[codecsv]/down,left,right,up,bom,shot,slow,start,pause
/↑ここは変えない↑/
0,1,2,3,8,4,6,5,7[/code]
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: Pause=Downとなるバグ

#2

投稿記事 by ookami » 9年前

amehiruneさん、
提示された部分だけでは何とも言えませんが、csvの最後の7を読んだ後、「if(input==',' || input=='\n'){//カンマか改行なら」に行かず「if(input==EOF){//ファイルの終わりなら」で終了しているのではないでしょうか。
その結果、configpad.pauseが初期化されずたまたま「0」だった場合、上記のような挙動になると思います。
ステップ実行等で確認してください。

あと、関係ないですがfscanf等の方が簡単では?

アバター
amehirune
記事: 181
登録日時: 10年前
住所: どっか
連絡を取る:

Re: Pause=Downとなるバグ

#3

投稿記事 by amehirune » 9年前

回答ありがとうございます。
[quote="ookami" id=3,15574,123778]amehiruneさん、
csvの最後の7を読んだ後、「if(input==',' || input=='\n'){//カンマか改行なら」に行かず「if(input==EOF){//ファイルの終わりなら」で終了しているのではないでしょうか。
その結果、configpad.pauseが初期化されずたまたま「0」だった場合、上記のような挙動になると思います。[\quote]
おっしゃられたことを参考に、まずはprintfDx関数でdownとpauseと、あとテスト用にrightの値を表示させてみたところ、
down=0
right=2
pause=0
と、おっしゃられた通りの実行結果が出ました。
そこで、csvファイルを以下のように変更してみました。

コード:

0,1,2,3,8,4,6,5,7

コード:

0,1,2,3,8,4,6,5,7,
コンマを付け加えたことにより、正常に動作するようになりました。

ここで質問なんですが、EOFに当たる文字(?)というのは、
「そのファイルの最後の文字」なのか、「最後に一応あるヌル文字のようなもの」なのか、いまいちよくわかっておりません。(分かりにくいですね^^;)
前者が正しいのであれば、この間違いに納得して解決とすることができるのですが、
後者であればこの解決方法の理解ができていないということになります。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: Pause=Downとなるバグ

#4

投稿記事 by ookami » 9年前

後者ですね。大抵は「-1」かと。
上でも書きましたが、ぜひステップ実行について調べてみてください。
実行中の変数の値を、プログラムを中断して調べたりすることができます。

ISLe()

Re: Pause=Downとなるバグ

#5

投稿記事 by ISLe() » 9年前

ファイルの終端にアクセスしたときのEOFと、いわゆるテキストファイルに含まれることのある終端文字(0x1a)は別モノです。

前者の場合、EOFに当たる文字というものは存在しません。
現在はテキストファイルでも終端文字を付加しないことが一般的になっていると思います。

読み込み操作を行った際にファイル終端に達するとライブラリ内部でそれが記憶され、そのまま続けて読み込み操作をするとEOFが返るようになります。
何か文字を読み込むとEOFになるのではなくて、ファイルの終端に到達することでライブラリ内部でEOF状態へと変化するわけです。

ただしファイルをテキストモードで開いているときは、終端文字を読み取るとそこがファイルの終端であるように振る舞います。

アバター
amehirune
記事: 181
登録日時: 10年前
住所: どっか
連絡を取る:

Re: Pause=Downとなるバグ

#6

投稿記事 by amehirune » 9年前

返信が遅くなってしまい、申し訳ありません。
お二方、ご回答ありがとうございました。
何となくですが、理解の方はできました。これから時間をかけながら(かけられるかな?^^;)勉強していこうと思います。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

閉鎖

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