C++ 如何显示此警告:警告#1011:非void函数末尾缺少return语句“;G";?

C++ 如何显示此警告:警告#1011:非void函数末尾缺少return语句“;G";?,c++,c,warnings,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 *

我使用一个名为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]);
}

这取决于您希望的错误处理情况,但最简单的方法是以某种方式打印诊断消息(
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;
    }
}

#包括
#包括
整数伽马、泽塔、α、β、chi、kappa、ω、φ;
双G(双t,双x[],整数j)
{
开关(j){
案例0:返回(x[1]);
案例1:返回(gama*sin(OMEGA*t)-zeta*x[1]-alpha*x[0]-beta*pow(x[0],3)-chi*x[2]);
案例2:返回(-kappa*x[1]-phi*x[2]);
违约:
#ifdef_uucplusplus
抛出std::无效的_参数(“…”);
#否则
printf(“在%s中的j%d无效”,j,_函数);
#恩迪夫
返回NAN;
}
}

这些都是条件返回。 如果这些条件中的任何一个不匹配,则会出现警告。
请在函数末尾提供一个默认返回值。

您没有考虑所有情况。可能存在三个if语句失败的情况

在这种情况下,您需要返回一些通常不会发生的错误。e、 g.返回
-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);
}

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

以下是实现此功能的两种可能方法:

std::可选

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
        //...
    }
}


如果
j
等于
3
或更多,或小于
0
,会发生什么?我写的方式是j==3+永远不会发生,这样代码可以完美工作,但会不断显示警告(当然,编译器不知道…)。那么,这样(return(-1)),它是否应该停止显示警告和代码,就像以前一样?感谢+1返回NAN是正确的解决方案。返回-1或任何其他数字或std::optional既不好也不过分。不过,人们可能会对printf产生争议。@AndreasH。当然,有更好的办法,但这与他的环境无关。@AndreasH。返回NAN不是正确的解决方案。实际上,正确的解决方案是抛出异常,因为输入j=5是一个逻辑错误。异常在被调用之前是免费的,因此它是非常轻量级的。这个问题也被标记为C,它没有异常。编辑:如果编译为C++@ TStnNER,添加一个异常,这是你的错误,它应该用C++或C++来标记,而不是两者都加标签。
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
    };
}