不要理解为什么我会收到警告“#Control;控制可能会达到无效功能的结束。"有什么建议吗?
这是我的代码:
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;
}
}
答案 0 :(得分:8)
如果使用第一个参数0
调用该函数,则永远不会执行循环,因此永远不会达到return
语句。非void
函数结束的下降是未定义的行为。
我的个人猜测是return
语句意味着向上一级,即在out区域中:这将保证函数始终返回一个值,警告就会消失。
答案 1 :(得分: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&lt; _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;
};
答案 2 :(得分:0)
确保在for循环之前添加无效参数检查。如果传递的参数之一具有无效值,请确保该函数将返回错误代码。