1

不明白为什么我会收到“控制可能达到非无效功能结束”的警告。有什么建议么?

这是我的代码:

long double geo_fn(long reps, int seed) {
    double x, y, pythag_sum, total = 0, inside = 0;
    default_random_engine engine(seed);             
    uniform_real_distribution<double>dist(0,1);

    for(int i = 0; i< reps ;i++){
        x = dist(engine);
        y = dist(engine);
        pythag_sum = (x*x)+(y*y);
        if (pythag_sum <= 1){
            inside += pythag_sum;
            total += pythag_sum;
        }
        else {
            total += pythag_sum;
         }
     return (inside/total)/10;
     }
}
4

3 回答 3

13

如果您使用0循环的第一个参数调用该函数,则永远不会执行该return语句,因此永远不会到达该语句。void非函数结束的下降是未定义的行为。

我个人的猜测是,该return语句意味着更高一级,即在 out 块中:这将保证函数始终返回一个值并且警告会消失。

于 2013-09-30T21:34:18.313 回答
3

无论您的期望如何,您都必须确保总会有一些东西要返回,因为您将函数返回类型声明为非 void。对于此代码,您将需要在“else”情况下出现的 return 语句

Image* Image::findAndClone( imageType type )
{

    if (_prototypes[i]->returnType() == type)
        return _prototypes[i]->clone();

};

这将是:

Image* Image::findAndClone( imageType type )
{

    if (_prototypes[i]->returnType() == type)
        return _prototypes[i]->clone();
    else return NULL;

};

在“for”循环的情况下,循环有可能会在“i < _nextSlot”处中断而实际上没有返回任何内容。编译器无法判断。所以你需要提供一个 return 语句来捕获“for”循环“从不执行”的情况。

Image* Image::findAndClone( imageType type )
{
    for (int i=0; i < _nextSlot; i++)
            return _prototypes[i]->clone();
    return NULL;
};

那么这只是结合两者的最后一个例子:

Image* Image::findAndClone( imageType type )
{
    for (int i=0; i < _nextSlot; i++)
        if (_prototypes[i]->returnType() == type)
            return _prototypes[i]->clone();
    return NULL;
};
于 2014-05-16T13:42:51.870 回答
0

确保在 for 循环之前添加无效参数检查。如果传递的参数之一具有无效值,请确保该函数将返回错误代码。

于 2013-09-30T22:13:26.050 回答