如何解决此警告:警告#1011:非void函数“ G”末尾缺少返回语句?

时间:2019-07-12 08:33:50

标签: c++ c warnings

我正在使用一个名为G的函数来描述runge-kutta方法的EDO,并且不断收到以下警告:警告#1011:非空函数“ G”末尾缺少return语句。该代码可以正常工作,但是我不希望有任何警告。怎么解决呢?预先感谢。

以下是函数:

double G(double t, double x[], int j)
{
    if (j == 0) return (x[1]);
    if (j == 1) return (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]);
    if (j == 2) return (-kappa * x[1] - phi * x[2]);
}

4 个答案:

答案 0 :(得分:1)

这取决于所需的错误处理情况,但是最简单的方法是以某种方式打印诊断消息(printf?)并返回NAN

switch语句还将帮助编译器更明确地告诉您错过了一个案例:

#include <math.h>
#include <stdio.h>
int gama, zeta, alpha, beta, chi, kappa, OMEGA, phi;
double G(double t, double x[], int j)
{
    switch(j) {
        case 0: return (x[1]);
        case 1: return (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]);
        case 2: return (-kappa * x[1] - phi * x[2]);
        default:
#ifdef __cplusplus
            throw std::invalid_argument("…");
#else
            printf("Invalid j %d in %s", j, __func__);
#endif
            return NAN;
    }
}

答案 1 :(得分:1)

这些都是有条件的回报。 如果这些条件中的任何一个都不匹配...该是警告。 请在函数末尾使用默认的返回值。

答案 2 :(得分:1)

您尚未考虑所有情况。在某些情况下,三个if语句将失败。

在这种情况下,您需要返回一些通常不会发生的错误。例如您返回-1的确切值将取决于调用函数以及如何处理错误情况。

double G(double t, double x[], int j)
{
    if (j == 0) return (x[1]);
    if (j == 1) return (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]);
    if (j == 2) return (-kappa * x[1] - phi * x[2]);

    return (-1);
}

答案 3 :(得分:0)

您尚未为函数中所有可能的路径编写return语句。

有两种方法可以实现此功能:

std :: optional

std::optional<double> G(double t, double x[], int j)
{
    auto result = std::optional<double>();
    if (j == 0) result = x[1];
    if (j == 1) result = (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]);
    if (j == 2) result = (-kappa * x[1] - phi * x[2]);

    return result;
}

int main(int argc, char *argv[])
{
    auto result = G(.....)
    if (result.has_value())
    {
        // Correct arguments
        //...
    }
    else
    {
        // Incorrect
        //...
    }
}

std :: exception

double G(double t, double x[], int j)
{
    double result;
    if (j == 0) result = x[1];
    else if (j == 1) result = (gama * sin(OMEGA*t) - zeta * x[1] - alpha * x[0] - beta * pow(x[0], 3) - chi * x[2]);
    else if (j == 2) result = (-kappa * x[1] - phi * x[2]);
    else {
        throw std::invalid_argument("Unable to find a valid code path");   
    }

    return result;
}

int main(int argc, char *argv[])
{
    try{
        auto result = G(.....)
    }
    catch (std::invalid_argument & ec){
        // Handle error
    };
}