2017-10-04 250 views
0

我使用的工具檢查下面的代碼的編碼標準投訴,「只能從循環中退出一次」。它表示「while(len < totalLen)」循環下面有一個額外的退出方式。它說「所有結構(函數,循環)都需要單個入口和單個出口」。我對此感到困惑,因爲它抱怨的while循環只有一個退出標準。退出循環

單個條目和單個退出條件的含義是什麼,下面的代碼如何違反它。 while循環中的if條件是必需的。如何保持它,並抱怨編碼標準

while (len < (totalLen)) 
    { 

    switch (*(structAddr + len - 1)) 
     { 

     case CASEA:      //8 byte data 


      while (len < totalLen) 
       { 
       if ((*(structAddr + len) == CASE0))       //this means there is no 8 byte data left to swap 
        { 
        arr[len] = *(nvStruct + len); 
        break; 
        } 

       arr[len]  = *(structAddr + len + 1); 
       arr[len + 1] = *(structAddr + len); 
       len   = len + 2; 

       } 

      break; 


     case CASEB:      //2 byte data 


      while ((*(structAddr + len + 1) != CASE0) && (len < totalLen)) 
       { 

       arr[len] = ((*(structAddr + len) << 16) & (0xffff0000)) | 
          ((*(structAddr + len) >> 16) & (0x0000ffff)); 
       len++; 
       } 

      break; 


     default:      //4 byte data - no swap needed 

      arr[len] = *(structAddr + len); 


     } 

    len++; 
    } 


} 
+2

它應該抱怨代碼的不一致性。 –

+0

請給我們一個完整的工作示例並正確縮進您的代碼 – savram

回答

2

因爲如果其他條件滿足你的循環有一個條件和突破,while循環。

while (len < totalLen) 
{ 
    if ((*(structAddr + len) == CASE0)) // It is complaining here 
    { 
     arr[len] = *(structAddr+len); 
     break; 
    } 
    arr[len] = *(structAddr + len + 1); 
    arr[len + 1] = *(structAddr + len); 
    len = len + 2; 
} 

上面的代碼退出循環,

  1. 如果len < totalLen
  2. 如果structAddr[len] == CASE0

你幾乎應該寫的方式,只有一個停止條件,或評估兩個條件在一個地方,如

do { 
    if ((*(structAddr + len) == CASE0)) 
    { 
     arr[len] = *(structAddr + len); 
     // I don't know if it will naturally stop here 
     // but certainly, the algorithm is too dark to see 
     // that's why this is discouraged. 
    } else { 
     arr[len] = *(structAddr + len + 1); 
    } 
    arr[len + 1] = *(structAddr + len); 
    len = len + 2; 
} while (len < totalLen); 

我仍然不知道這是否正確,因爲你的代碼看起來很糟糕,並且不要在實際代碼中使用類似*(structAddr + len)的東西,而是使用structAddr[len]而不是簡單的解釋和讀取。

+0

做 如果((nvStruct [len] == BYTETYPE)) { arr [len] = nvStruct [len]; } else { arr [len] = nvStruct [len + 1]; arr [len + 1] = nvStruct [len]; len = len + 2; ((len user2927392

0

這種方法可能會解決您的問題,但不確定。

do { 
    if ((*(structAddr + len) == CASE0)) 
     arr[len] = *(structAddr + len); 
    else 
     arr[len] = *(structAddr + len + 1); 

    arr[len + 1] = *(structAddr + len); 
    len = len + 2; 
} while (len < totalLen && !(*(structAddr + len) == CASE0));