我有一个双精度数组,需要对该数组进行计算,然后找到该计算产生的最小值和最大值。这基本上就是我所拥有的:
double * array;
double result;
double myMin;
double myMax;
// Assume array is initialized properly...
for (int i = 0; i < sizeOfArray; ++i) {
result = transmogrify(array[i]);
if (i == 0) {
myMin = result;
myMax = result;
}
else if (result < myMin) {
myMin = result;
}
else if (result > myMax) {
myMax = result;
}
}
我收到一条警告,表示从未使用result
计算的值,因为我们将所有警告都视为错误,所以这不会编译。如何修复此代码以避免警告?我正在为我的编译器使用g ++。
这是警告文字:
cc1plus: warnings being treated as errors
foo.cc:<lineno of transmogrify call>: error: value computed is not used
编辑:我不理解下来的选票,但我现在已经开始工作了。感谢大家花时间帮助我。
答案 0 :(得分:4)
假设你不需要循环外的result
,你可以在循环中声明result
:
for( int i=0; i < sizeOfArray; ++i ) {
double result = transmogrify( array[i] );
...
}
答案 1 :(得分:4)
我收到警告说从未使用
result
计算的值,因为(理论上)可能不会选择任何if / else分支
这不是警告的原因,因为result
也用于if条件。即使没有采取任何分支,result
仍然用于决定不应该采取这些分支。
答案 2 :(得分:2)
分别用DBL_MAX和DBL_MIN初始化myMin和myMax,并通过循环检查第一次摆脱。
答案 3 :(得分:1)
我不认为发布的代码会产生错误,除非编译器正在进行一些现象流分析。它当然可以用g ++编译好,但我不确定g ++是否支持你得到的警告。
以下对代码的修改(保留其结构)不会产生g ++错误:
int main() {
double * array;
double result;
double myMin;
double myMax;
double t(double);
// Assume array is initialized properly...
for (int i = 0; i < 10; ++i) {
result = t(array[i]);
if (i == 0) {
myMin = result;
myMax = result;
}
else if (result < myMin) {
myMin = result;
}
else if (result > myMax) {
myMax = result;
}
}
}
答案 4 :(得分:1)
result = [...]
if (i == 0) {
[... do something with result ...]
}
else if (result < myMin) {
在if()的两个分支中,使用result
。在第一种情况下,它被分配给一个变量,在第二种情况下,它用于比较。所以编译器不应该发出警告。
我怀疑你可能误解了这个问题。请问你能准确说出错误信息是什么(复制粘贴)。另外,请尝试发布实际编译的最小代码并发出警告? (只是尝试这样做可能会让你发现问题)
编辑:transmogrify()是否可能是内部使用result
的宏?
答案 5 :(得分:1)
在“if”声明之前:
result = 0.0;
或其他一些价值。在使用它之前将变量设置为某个值始终是一种好的形式。
答案 6 :(得分:1)
我收到一个警告,表示从未使用为result计算的值,因为(理论上)可能不会选择任何if / else分支,并且由于我们将所有警告视为错误,因此不会编译。如何修复此代码以避免警告?我正在为我的编译器使用g ++
始终使用用于结果的值。如果未分配,则在比较器中使用。因此编译器有问题。
答案 7 :(得分:0)
快速解决方案可能是展开第一次迭代,如下所示:
double * array;
double result = transmogrify(array[0]);
double myMin = result;
double myMax = result;
int i;
for (i = 1; i < sizeOfArray; ++i) {
result = transmogrify(array[i]);
if (result < myMin) {
myMin = result;
}
if (result > myMax) {
myMax = result;
}
}
编辑:我会对此进行一些扩展。你没有提供有关sizeOfArray的任何详细信息,但我的猜测是它是一个有符号整数类型。
我相信你误解了警告的原因,结果可能未被使用,因为sizeOfArray可能小于或等于零,而不是因为循环中的if..else子句。在上面的代码中,为什么需要小心处理大小写(sizeOfArray&lt; = 0)可能会更清楚一点,但它在原始代码片段中同样重要。
答案 8 :(得分:-1)
删除第一个else只会影响第一次循环的运行时间。我宁愿消除它。
if (i == 0) {
myMin = result;
myMax = result;
}
if (result < myMin)
myMin = result;
else if (result > myMax)
myMax = result;