2016-01-16 49 views
1
double interpolation(int input, vector<int>&a, vector<double>&b) 
{ 
    for(int i=0;i<a.size();++i) 
    { 
     if(input==a.at(i)) 
      return b.at(i); 
    } 

    for(int i=0;i<a.size()-1;++i) 
    { 
     if(input>a.at(i)&&input<a.at(i+1)) 
     { 
      int low=i; 
      int high=i+1; 
      double m= b.at(low); 
      int n= input-a.at(low); 

      int p= a.at(high) - a.at(low); 
      double q= b.at(high) - b.at(low); 

      double fp = (m+n)/(p*q); 
      return fp; 
     } 
    }   
} 

返回我一直得到警告:控制到達非void函數[-Wreturn型] }消息的結束。在雙功能

我知道它與我向函數返回值的方式有關。函數的目的是計算f(b)= f(a)+(b - a)/(c - a)(f(c) - f(a))。這很難解釋什麼是方程式,但耶穌幫助回報會做我認爲的詭計。

回答

0

因爲你的兩個return報表以if語句包裹的if報表可能不會評估爲true,因此兩個return S可能會發生無法達到和編譯器不知道在這種情況下返回。你可以添加一個默認的返回值:

double interpolation(int input, vector<int>&a, vector<double>&b) 
{ 
for(int i=0;i<a.size();++i) 
{ 
    if(input==a.at(i)) 
    return b.at(i); 

} 

for(int i=0;i<a.size()-1;++i) 
{ 
    if(input>a.at(i)&&input<a.at(i+1)) 
    { 
    int low=i; 
    int high=i+1; 



    double m= b.at(low); 
    int n= input-a.at(low); 

    int p= a.at(high) - a.at(low); 
    double q= b.at(high) - b.at(low); 

    double fp = (m+n)/(p*q); 
    return fp; 
    } 
} 

return 0.0; 

} 
0

不函數插值的所有執行路徑返回一個值。您可以提供快速修復,最後附加返回0,但我不知道這是適合這段代碼的行爲。

1

您的return陳述在條件if塊。如果這些if語句都不是true?您需要提供一個不是有條件的return值,即在函數結束時。

此外,編譯器會給出這樣一個警告的一個很好的理由是退出一個應該返回值但沒有的函數會導致未定義的行爲

2

您收到警告,因爲當'a'向量的大小爲零時,代碼不會返回值。 在這種情況下,它可能應該返回零,除非錯誤代碼更合適。

1

警告消息(控件達到非void函數的末尾)是完全正確的:在沒有返回語句的情況下,可執行代碼中至少有一條路徑。

有些人會認爲你的功能應該只有一個return。這是做到這一點的一種方式。

另一種方法是添加一個「默認」返回語句,這意味着將一個return放在函數的最後(即在最後一行}之前的行上)。最好的做法是通過#define使其成爲典型的錯誤代碼或預定的代碼,以使其更易於閱讀,例如,考慮到數學運算功能正在執行(插值),使用其絕對值非常大的默認值(例如,大於等於0)可能是有意義的。 -INF或類似-9999999999.0的東西,所以很明顯(如果圖表)出現問題。然而,錯誤值可能仍然更合適,以便調用代碼處理錯誤,而不是據說提供真正的答案。