C++ 如何显示此警告:警告#1011:非void函数末尾缺少return语句“;G";?
我使用一个名为G的函数来描述runge-kutta方法的EDO,我不断得到这样的警告:警告#1011:在非无效函数“G”的末尾缺少return语句。代码运行得很好,但我不希望出现任何警告。如何解决?提前谢谢 以下是函数: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 *
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
};
}