2016-09-28 79 views
0

我試圖讓這個分治工作的結束,但是編譯器是給我:分而治之,可達到非void函數

控制可以達到非空結束函數

我已經通過類似的方案閱讀,並瞭解錯誤意味着程序可能會永遠運行而不會返回。我已經回顧了一些使用「else」而不是「if else」解決的情況(應該先開始)。但是,這並沒有幫助。

我知道在這種情況下使用do while循環並返回是多餘的,我正在擺弄它,希望欺騙編譯器。

錯誤在哪裏?

bool search(int value, int values[], int n) 
{ 
    int sorted = 0; 
    int min = 0; 
    int max = n; 
    int mid = n/2; 

    do 
    { 
     //mid is value 
     if (value == values[mid]) 
     { 
      printf("value found!"); 
      sorted = 1; 
      return 1; 
     } 
     //search right 
     else if (values[mid] < value) 
     { 
      min = mid + 1; 
      mid = (max - mid)/2 ; 
     } 
     //search left 
     else if (values[mid] > value) 
     { 
      max = mid - 1; 
      mid = (max - mid)/2; 
     } 
     // DNE 
     else 
     { 
      printf("value not found"); 
      sorted = 1; 
      return 0; 
     } 
    } 
    while(sorted == 0); 
} 
+8

錯誤是因爲你的函數中的do-while循環後沒有'return;'語句。如果在循環結束後沒有找到值'return''0',那麼做一件事情,所以不需要檢查並且錯誤將被解決。 – ameyCU

+1

有幾個錯誤。 – BLUEPIXY

+4

「程序可能會永久運行而不會返回」 - 這不是錯誤的含義。 – melpomene

回答

0

如果函數假設返回一個值,則代碼的每個分支都應該有return。 在你的情況下,while你必須把return。如何,你的邏輯也有點不對。在你的代碼中不需要變量sorted,終止條件也是錯誤的,以及計算mid的方式也是錯誤的。不要擔心,這裏是你更新後的代碼:

bool search(int value, int values[], int n) 
{ 
    //int sorted = 0; 
    int min = 0; 
    int max = n; 
    int mid = n/2; // S1 

    do 
    { 
     //mid=(max+min)/2; // S2 
     //mid is value 
     if (value == values[mid]) 
     { 
      //printf("value found!"); 
      //sorted = 1; 
      return 1; 
     } 
     //search right 
     else if (values[mid] < value) 
     { 
      min = mid + 1; 
      mid = (max + min)/2 ; // S3 
     } 
     //search left 
     else if (values[mid] > value) 
     { 
      max = mid - 1; 
      mid = (max + min)/2; //S4 
     } 
     // DNE 
     else 
     { 
      //printf("value not found"); 
      //sorted = 1; 
      return 0; 
     } 
    } 
    while(min!=max); 
    return 0; 
} 

所以,如果你的函數返回1意思發現價值,否則值沒有找到。 你也可以對S1,S3和S4發表評論,並取消註釋S2代碼的最小行數。 而找到mid的方式將是mid=(max+min)/2

+0

您好,感謝您的幫助!這也是我對中期公式的想法,但這隻適用於第一個例子。 之後的所有實例(搜索左右),我不得不修改代碼爲 mid =((max + min)/ 2)+ min –

+0

@FreddyKong根據'value'的位置,我們正在改變'min'和'max'的價值。在第一次min將是'(mid + min)/ 2',即(0 + n)/ 2,現在假設你正在搜索的'value'是'mid'的左邊,那麼'min'將是0, max'將是'mid-1',然後計算中間公式是相同的'(max + min)/ 2'只有'max'的值是變化的。希望我清楚。 –

+0

哦,你是對的。我的公式是(最大 - 最小)/ 2 +最小。我想我已經完成了複雜的事情。 (max + min)/ 2 + min顯然是錯誤的。 –

0

忽略代碼中的其他問題(雖然我沒有仔細研究它,但在某些情況下循環不會終止),讓我們來看看編譯器爲什麼會抱怨,因爲它很有趣。

你的編譯器會抱怨你在while循環後沒有返回函數的結尾(我們可以從警告消息中讀出的東西)。您循環運行:

while(sorted == 0); 

到處都改變sorted,你這樣做:

 sorted = 1; 
     return X; 

所以這是很明顯的你和我,雖然條件將永遠是真實的,你不會掉到while循環之後,需要返回。每當你使這個條件不成立時,你也立即返回。但編譯器不知道這一點。它可能會花費更多的努力,但是在任何情況下永遠都不會寫出來,並且你也不會接受一個慢的編譯器。完全分析任何一點代碼以瞭解你和我所知道的事情(我們永遠不會掉到循環中)的問題幾乎是停滯的問題(如果你不知道它是什麼,你應該,谷歌它)。

在這種情況下,我們需要與編譯器一起工作,並幫助它理解。我將在函數的末尾添加return sorted;,將環路條件更改爲while (1),並用sorted = X; break;替換​​3210以跳出循環並使函數僅從一個位置返回(讀取只有一個函數的函數更容易或很少返回聲明)。或者只是刪除sorted變量,正確執行回報並永久循環。

0

我認爲你的編譯器不喜歡你對控制流程的理解。作爲初學者,這是最棘手的問題之一。

您的錯誤解釋:控制可能會達到非無效功能的結束。每當你分支你的代碼(即使用循環,如果,切換等),你必須明確地寫出每個分支將做什麼。所以在你的代碼中,你必須以任何必要的方式返回一個bool。

我無法辨別錯誤可能在哪裏,如果有人可以給我看,那將會很棒。

看看我們有兩個return x;語句,在if一塊和第二在else塊一個。現在我們認爲控制應該來自這兩個區塊中的return。但是你的編譯器「有關」關於如果控制沒有輸入這些塊和循環結束時會發生什麼。而且,循環後會發生什麼,如何控制曾經的return?因此錯誤。

現在我們可以做什麼來解決這個問題是在函數結束之前添加一個return 0;。這肯定會使錯誤消失。但是,有更好的方法來解決這個問題:

bool search(int value, int values[], int n) { 
    int min = 0, max = n; 
    int mid = n/2; 
    bool is_found = 0; 
    while (min != max) { 
     if (value == values[mid]) { 
      is_found = 1; 
      break; 
     } 
     else if (value > values[mid]) { 
      min = mid + 1; 
      mid = (max + min)/2; 
     } 
     else if (value < values[mid]) { 
      max = mid - 1; 
      mid = (max + min)/2; 
     } 
     else break; 
    } 
    return is_found; 
}