[решено] странное поведение switch

marina7573

Написал простенький код, который сопоставляет номеру от 0 до 35 строку, содержащую название этой карты.
 
int iSuit,iValue;
char cSuit[2],cValue;
iSuit=CardNum/9;
iValue=CardNum%9;
printf ("CardNum=%d\n",CardNum);
printf ("%d\t%d\n",iValue,iSuit);
switch (iSuit)
{
case 0:
strcpy(cSuit,"Ch");
break;
case 1:
strcpy(cSuit,"Bu");
break;
case 2:
strcpy(cSuit,"Pi");
break;
case 3:
strcpy(cSuit,"Tr");
break;
};

switch (iValue)
{
case 0:
case 1:
case 2:
case 3:
cValue='0'+iValue+6;
break;
case 4:
cValue='T';
break;
case 5:
cValue='J';
break;
case 6:
cValue='Q';
break;
case 7:
cValue='K';
break;
case 8:
cValue='A';
break;
};

printf ("%c_%s\n",cValue,cSuit);

В результате код правильно распознаёт масть, но неправильно распознаёт значение карты:
 
 
CardNum=32
5 3
6_Tr
CardNum=31
4 3
6_Tr
CardNum=20
2 2
6_Pi
CardNum=13
4 1
6_Bu

Собственно, втф? Почему свитч работает как-то не так?

ppplva

strcpy(cSuit,"Tr");
пишет 3 байта в 2-х байтный массив, и, вероятно, затирает iValue нулем.

marina7573

спасибо! Дело именно в этом. Забыл, что строки заканчиваются на '\0'

elenangel

попробуй использовать std::map вместо этого свича, удобно с вот таким шаблоном:
 

template <typename T, typename U>
class CreateMap
{
private:
std::map<T, U> m;
public:
CreateMap(const T& key, const U& val);

CreateMap<T, U>& operatorconst T& key, const U& val);

operator std::map<T, U>
};

template <typename T, typename U>
CreateMap<T,U>::CreateMap(const T& key, const U& val)
{
m[key] = val;
}

template <typename T, typename U>
CreateMap<T, U>& CreateMap<T,U>::operatorconst T& key, const U& val)
{
m[key] = val;
return *this;
}

template <typename T, typename U>
CreateMap<T,U>::operator std::map<T, U>
{
return m;
}

использование:
 


std::map<int, std::string> intToSuitMap = CreateMap<int,std::string>(0, "Ch") (1,"Bu") (2, "Pi") (3, "Tr");
std::map<std::string, int> suitToIntMap = CreateMap<std::string, int>("Ch", 0) ("Bu", 1) ("Pi", 2) ("Tr", 3);
.....

int iSuit = 42;
assertiSuit>=0) && (iSuit<=3;
std::string cSuit = intToSuitMap[iSuit];

и обратно:

iSuit = suitToIntMap[cSuit];

Anturag

попробуй использовать std::map вместо этого свича, удобно с вот таким шаблоном:
Почему сразу не советуешь на Ruby или Perl писать?

elenangel

потому что при помощи доброго слова и темплейта из c++ можно сделать руби и перл

apl13

Да, но
зачем?

zya369

да, одна очепяточка в инициализации и превед :D

Papazyan

при помощи доброго слова и темплейта из c++ можно сделать руби и перл
Свят, свят :shocked:
Оставить комментарий
Имя или ник:
Комментарий: