嵌套的開關,你可以爲這種問題最糟糕的事情。查找表要簡單得多。你可能需要像這樣的東西:
struct SCSILookupTableElement
{
unsigned char key;
unsigned char asc;
unsigned char ascq;
const char *errorcondition;
} SCSILookupTable[] =
{
{ 0, 0, 0, "No error"},
{ 0, 0x5d, 0, "No sense - PFA threshold reached"},
{ 1, 1, 0, "Recovered Write error - no index"},
...
{0xff, 5, 0, "Illegal request"} // 0xff stands for X
...
};
const char *SCSIErrortext(int key, int asc, int ascq)
{
int i ;
for (i = 0; i < sizeof(SCSILookupTable)/sizeof(struct SCSILookupTableElement); i++)
{
if ( (SCSILookupTable[i].key == key || SCSILookupTable[i].key == 0xff)
&& SCSILookupTable[i].asc == asc
&& SCSILookupTable[i].ascq == ascq)
{
return SCSILookupTable[i].errorcondition;
}
}
return "Unknown error";
}
void main()
{
printf ("%s\n", SCSIErrortext(0, 0x5d, 0));
printf ("%s\n", SCSIErrortext(0xfe, 0x05, 0));
printf ("%s\n", SCSIErrortext(0x00, 0x05, 0));
}
雖然確實有改善的空間,但它不能簡單一些。
的不明身份的複雜性,以這是意義關鍵是獨立的ASC/ASCQ號的所以你需要有非常相似的字符串,而不是單獨解決代碼各部分的好幾倍,然後用sprintf的結合起來。 – 2014-11-04 11:58:40