嵌套循环的优化。。。

来源:互联网 发布:无线安全助手for mac 编辑:程序博客网 时间:2024/06/05 18:31

 我写过的嵌套循环查询函数,目的是着个位置把不重复的设备名存起来,这个函数写了整整2个小时,才终于可以运行,计算机真辛苦》。。。。。。
====================原创版本,最费力起,也最容易出错
BOOL
Check_and_ADD_USB_Device()
{
int i;
int i2;
int i3;
if ( !GetUsbDeviceFileName(
 (LPGUID) &GUID_CLASS_I82930_BULK,
 completeDeviceName,0) )
    {

// NOISY(("Failed to GetUsbDeviceFileName:%d/n", GetLastError()));
 return  0;
    }
else
  {
 TRACE("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/r/n");
 TRACE(completeDeviceName);
 TRACE("/r/n"); 


 for(i=0;i<MAX_USB_Device+1;i++)
 {
 if(USBDevice_Names[i][0]=='/0') //证明此处是空的;
  {
                  for(i2=0;i2<MAX_USB_Device+1;i2++)//检查是否跟上一个重复
                  {
                   if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
    {
      
    int report_error_time;
    BOOL Gotit=0;
    report_error_time=GetUSBDeviceName_Times;// =给它8次机会获得completeDeviceName
       while(report_error_time||(!Gotit))
       {
        
         for(i3=0;i3<MAX_USB_Device+1;i3++)
        {

     
    if( GetUsbDeviceFileName((LPGUID) &GUID_CLASS_I82930_BULK,completeDeviceName,i3))
       { 
                                      if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
                   continue;                                     
          else 
           {
           Gotit=1;
             break;//获得不重复的
           }
       }//获取成功的支线

      
    else
     {
     report_error_time--;//接着获取邋completeDeviceName 7次
      if(!report_error_time)
       {
                                     AfxMessageBox("Get USB DeviceFileName error over d% times!!!",GetUSBDeviceName_Times);
                                   break;//超过次数 跳出报警
              }
         
     }//获取不成功的支线
    
           }//end for i3
        }//end while report_error_time

   
      }//正确获得没有重复的completeDeviceName
   
                        }//换个USBDevice_Names[i2]继续比较,直到都不重复
    memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));
                         break;     
                  } //有空位的地方            
  
  
   }//end for i
    }//最外面的IF ELSE结尾

   return 1;
 }//只增不减

=====================================================第一次优化把查空函数提前了
后来的改造

{
int i;
int i2;
int i3;
for(i=0;i<MAX_USB_Device+1;i++)
 {
 if(USBDevice_Names[i][0]=='/0') 
  {
GETname:  
  for (i3=0;i3<MAX_USB_Device+1;i3++)
   {
   if ( !GetUsbDeviceFileName(
   (LPGUID) &GUID_CLASS_I82930_BULK,
   completeDeviceName,i3) )
    {
    AfxMessageBox("usb不能找到名字!!");
    return 0;
    break;
    }
   else
    {
    for(i2=0;i2<MAX_USB_Device+1;i2++)
     {
     if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
      {
      goto GETname;
      }
     
     }
    memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));      
                   break;

    }
   
   }
  }
        if(i==8)
 AfxMessageBox("最大连接数超出 !!");

 }//?òμ?óD??μ?i ?-?·
   return 1;
}
=====================================================================第二次优化
{
int i;
int i2;
int i3;
BOOL infor=0;
for(i=0;i<MAX_USB_Device+1;i++)
 {
 if(USBDevice_Names[i][0]=='/0') 
  {
  
  for (i3=0;i3<MAX_USB_Device+1;i3++)
   {
   infor=0;
   if ( !GetUsbDeviceFileName(
   (LPGUID) &GUID_CLASS_I82930_BULK,
   completeDeviceName,i3) )
    {
    AfxMessageBox("usb不能找到名字!!");
    return 0;
    break;
    }
   else
    {
    for(i2=0;i2<MAX_USB_Device+1;i2++)
     {
     if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
      {
      infor=1;
      continue;
      }
     
     }
    if(infor) continue;
    memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));      
                 return 1;

    }
   
   }
  }

        if(i==8)
 AfxMessageBox("超出最大连接数!!");

 }//?òμ?óD??μ?i ?-?·
============================
GetUsbDeviceFileName 函数中
....
   SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
 //  free ( *UsbDevices );
  *UsbDevices = NULL;
UsbDevices = NULL;
   return hOut;

妈的一free 就乱跑,还得哥们弊掉它,直接用空指针算了!

=========================================极了,总是出错,看来再简单一些,第三次优化!!!最简单版本

{
int i;
int i2;

BOOL infor=0;
for(i=0;i<MAX_USB_Device+1;i++)
 {
 if(USBDevice_Names[i][0]=='/0') 
  {   
 
 
   if ( !GetUsbDeviceFileName(
   (LPGUID) &GUID_CLASS_I82930_BULK,
   completeDeviceName,i3) )
    {
    AfxMessageBox("usb没找到名字!!");
    //return 0;
    break;
    }
   else
    {
  check:  
    for(i2=0;i2<MAX_USB_Device+1;i2++)
     {
     if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
      {
      i3++;
      GetUsbDeviceFileName( (LPGUID) &GUID_CLASS_I82930_BULK, completeDeviceName,i3) ;
      goto check;
      //infor=1;
      //continue;
      }
     
     }    

    }
   //if(infor) continue;
    memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));      
                 return 1;
   
   
  }

        if(i==8)
 AfxMessageBox("超过最大连接数!!");

 }//
 
}

原创粉丝点击