[英]How to fiz this warning: warning #1011: missing return statement at end of non-void function “G”?
我正在使用一個名為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;
}
}
這些都是有條件的回報。 如果不符合這些條件,那么該怎么辦?因此就是警告。 請在函數末尾有一個默認的返回值。
你沒有考慮過所有案件。 可能存在三個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);
}
您沒有為函數中的所有可能路徑編寫返回語句。
您可以通過以下兩種方式實現此功能:
的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
//...
}
}
的std ::例外
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
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.