2016-10-01 62 views
-4

請有人可以給我解釋一下什麼是錯的,爲什麼我收到此錯誤:錯誤:控制可以達到非void函數結束

error: control may reach end of non-void function 

我試圖做一個功能linearsearch()拍攝鍵和表返回如果找到元素的索引。 令人困惑;我是一名初學者,參加cs50在線課程;我以前從未有過這個錯誤。

#include <stdio.h> 
#include <string.h> 
#include <cs50.h> 

int linearsearch(int key, int array[]); 

int main(int argc , string argv[]) 
{ 
    int key = 0; 
    int table[]={2,4,5,1,3}; 

    printf("%i is found in index %i\n",key,linearsearch(1,table)); 
} 

int linearsearch(int key, int array[]) 
{ 
    for(int i = 0;i<5;i++){ 
     if(array[i] == key) 
     { 
      return i; 
     }  
     else{ 
      return -1; 
     } 
    } 
} 
+0

有不從無void函數在這裏返回一個值不適用的錯誤。有*可能*是一個(不正確的)編譯器*警告*雖然。代碼中顯而易見的錯誤在其他地方。 – EOF

+0

可能錯誤是指不從'main'返回一個值(並且編譯器處於C99之前的模式)。錯誤消息應該有一個與其關聯的行號。 –

回答

1

在過去爲您傳回從功能不管怎樣東西環路,所以不應該有任何問題(除非你的算法是錯誤的:如果沒有找到它不應該立即返回)。

問題是:編譯器不一定看到你要返回任何數據。它只是看到,不要結束你的例程返回的東西。

大多數編譯器可以計算出簡單的情況下,像:

if (x) return 0; else return 1; 
    // not returning anything in the main branch but ok as it's seen as unreachable 
} 

,但在你的情況,你有一個for循環包裹返回指令。編譯器不是控制流量分析器。他們做基本的事情,但肯定不是正式的執行。所以有時候他們會從你的角度出現一個「確定」的警告。

無論如何,您的算法不正確,如前所述。只有當循環結束而沒有發現任何東西時才返回-1來修復它。

在這種情況下,您修復了錯誤和警告。所以你看到的警告是正確地檢測到你的代碼中有腥意的東西。

固定碼:

for (int i = 0; i < 5; i++) 
{ 
    if (array[i] == key) 
    { 
     // found return & exit loop 
     return i; 
    }  
} 
// not found, end of loop: return -1 
return -1; 
+0

非常感謝我得到它我不知道我是如此盲目我犯了這個錯誤現在它的工作reaaly你救了我的生命 –

相關問題