2016-01-16 51 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的东西,所以很明显(如果图表)出现问题。然而,错误值可能仍然更合适,以便调用代码处理错误,而不是据说提供真正的答案。