Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        5年前关闭。
                                                                                            
                
        
正如大多数人会知道谁使用过SCSI一样,如果发出SCSI命令,则设备可以返回带有附加信息的所谓的感应代码。

基本上,您有3个数字,它们一起具有含义。

这是维基百科上的列表:
http://en.wikipedia.org/wiki/Key_Code_Qualifier

我需要一个函数,该函数接受这3个数字并确定发生了什么错误,并基于该错误返回一个char数组。
我一直在想这样做的好方法。如果语句看起来如此模糊,则分支...

我想知道是否有一种简单的方法来执行此操作而不需要一些复杂的功能。

最佳答案

对于此类问题,嵌套开关是最糟糕的事情。查找表要简单得多。您可能需要这样的东西:

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));
}


尽管肯定还有改进的余地,但很难做到。

10-04 11:55