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