我该如何更正导致“未计算值计算”警告的代码?

时间:2009-04-27 16:20:41

标签: c++ g++

我有一个双精度数组,需要对该数组进行计算,然后找到该计算产生的最小值和最大值。这基本上就是我所拥有的:

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
编辑:我不理解下来的选票,但我现在已经开始工作了。感谢大家花时间帮助我。

9 个答案:

答案 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;