簡體   English   中英

如何引發此警告:警告#1011:在非空函數“G”結束時缺少return語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM