template関数の動作がおかしい

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

template関数の動作がおかしい

#1

投稿記事 by MNS » 16年前

C++の質問はいけないのかもしれませんが、規約を読んだ限り禁止はされていないようなので、質問させていただきます。

コンパイラ:Visual C++ 2008 Express Edition
OS:Vista

今、C++の勉強をしていて、クラスやSTL、テンプレートなどを多く使ったシューティングゲームを作っています。
このサイトを参考に、敵のデータをエクセルで管理しようと思いました。
パターンデータや敵の種類は定数で管理していたので、文字列から定数へキャストする関数を作りました。
template<class CAST_ENUM> int EnemyControl::CastCharToEnum(CAST_ENUM e_error, CAST_ENUM e_max, const char c_state_letter[/url][60], const char *cast_char, int number)
{
	CAST_ENUM cast_enum = e_error;
	for(int i = 0; i<e_max; ++i)
	{
		if(strcmp(c_state_letter,cast_char) == 0)
		{
			cast_enum = static_cast<CAST_ENUM>(i);
			break;
		}
	}
	return cast_enum;
}

という関数です。
enum ENEMY_PATTERN
{
	PATTERN_ERROR = -1,
	NORMAL_MOVE = 0,
	GOING_STRAIGHT_MOVE,
	GO_DOWN_MIDDLE_AND_COMEBACK,
	PATTERN_MAX
};
const char CAST_CHAR_PATTERN[PATTERN_MAX][60] = 
{
	"NORMAL_MOVE",
	"GOING_STRAIGHT_MOVE",
	"GO_DOWN_MIDDLE_AND_COMEBACK"
};
enum ENEMY_KIND
{
	KIND_ERROR = -1,
	GREEN_ENEMY = 0,
	RED_ENEMY,
	BLACK_ENEMY,
	KIND_MAX
};
const char CAST_CHAR_KIND[KIND_MAX][60] = 
{
	"GREEN_ENEMY",
	"RED_ENEMY",
	"BLACK_ENEMY"
};

このように、ENEMY_PATTERNとENEMY_KINDという定数があります。
そして、それぞれに対応した二次元文字列配列を宣言しています。

エクセルには、パターンが6列目、種類が7列目に書いてあるので、
ロードの際は
case 5: newloadEnemy.tem_pattern = static_cast<ENEMY_PATTERN>(CastCharToEnum<ENEMY_PATTERN>(PATTERN_ERROR,PATTERN_MAX,CAST_CHAR_PATTERN,cMemoly,column)); break;
case 6: newloadEnemy.kind = static_cast<ENEMY_KIND>(CastCharToEnum<ENEMY_KIND>(KIND_ERROR,KIND_MAX,CAST_CHAR_KIND,cMemoly,column)); break;

といった形でロードしています。
(cMemolyはこのサイトでいうinputcにあたります。columnはnにあたります。)
このとき、case 5の場合はしっかりと動作するのですが、
case 6では何故かうまく動作せず、全て戻り値が-1になってしまいます。
ちなみに、エクセルでパターンを7列、種類を6列にして、
case 5に static_cast<ENEMY_KIND>(・・・ を
case 6に static_cast<ENEMY_PATTERN>(・・ を移動したところ、
同じようにcase 5は動作するのですが、6は動作しません。
(つまり、ENEMY_KINDとENEMY_PATTERNと関係なく動作する)

解決方法が皆目見当がつきません。
どなたか、回答をお願いします。
(一応、全ての画像・エクセルデータ、プログラムを圧縮して添付しておきます。
これだけのコードじゃ把握できないという場合は、
お手数ですが、解凍してご利用ください。)

Justy

Re:template関数の動作がおかしい

#2

投稿記事 by Justy » 16年前


>同じようにcase 5は動作するのですが、6は動作しません

 CSVから切り出した文字列をデバッガでよく見て下さい。
 例えば "GREEN_ENEMY"ですと、文字列の最後に改行[C[/url]が付いた
"GREEN_ENEMY\r"になっていますよ。

MNS

Re:template関数の動作がおかしい

#3

投稿記事 by MNS » 16年前

ご回答ありがとうございました!
おかげで解決することができました。

閉鎖

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