【问题标题】:Returning in double functions以双重功能返回
【发布时间】:2016-01-17 09:24:22
【问题描述】:
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-type] } 消息。

我知道这与我向函数返回值的方式有关。该函数的目的是计算 f(b) = f(a) + (b - a)/(c - a)(f(c) - f(a))。很难解释等式是什么,但是我认为帮助返回可以解决问题。

【问题讨论】:

    标签: c++ function return double


    【解决方案1】:

    您收到警告是因为当“a”向量的大小为零时代码不返回值。 在这种情况下它可能应该返回零,除非错误代码更合适。

    【讨论】:

      【解决方案2】:

      您的 return 语句位于条件 if 块中。如果这些if 语句都不是true 怎么办?您需要提供一个非条件的 return 值,即在函数结束时。

      另外,编译器给出这样一个警告的一个很好的原因是退出一个应该返回值但没有返回值的函数会导致未定义的行为

      【讨论】:

        【解决方案3】:

        警告信息(控制到达非空函数的末尾)完全正确:在您的可执行代码中至少有一个路径没有返回语句。

        有些人会争辩说你的函数中应该有一个return。这是一种方法。

        另一种方法是添加一个“默认”返回语句,这意味着在函数的最后放置一个return(即在最后一个}之前的行上)。最佳实践是通过#define 使其成为典型错误代码或预定代码,以使其更具可读性,例如

        #define RET_ERR_VAL -1.0
            return RET_ERR_VAL;
        }
        

        考虑到函数正在执行的数学运算(插值),使用绝对值非常大的默认值可能是有意义的,例如-INF-9999999999.0 之类的东西很明显(如果用图表表示)出了点问题。但是,错误值可能仍然更适合调用代码处理错误,而不是据称提供真正的答案。

        【讨论】:

          【解决方案4】:

          因为您的两个 return 语句被封装在 if 语句中,所以 if 语句可能不会评估为真,因此可能无法达到两个 returns 并且编译器不知道返回什么那个案子。您可以添加默认返回值:

          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;
          
          }
          

          【讨论】:

            【解决方案5】:

            并非所有函数插值的执行路径都返回一个值。您可以提供快速修复,在末尾附加 return 0 但我不知道这是否适合这段代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多