0

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

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

编辑:我不明白反对票,但我现在已经开始工作了。感谢大家花时间帮助我。

4

9 回答 9

4

假设您不需要result在循环之外,您可以result在循环内声明:

for( int i=0; i < sizeOfArray; ++i ) {
    double result = transmogrify( array[i] );
    ...
}
于 2009-04-27T16:26:49.697 回答
4

我收到一个警告说计算的值result从未使用过,因为(理论上)可能不会选择任何 if/else 分支

这不能是警告的原因,因为result也用于 if 条件。即使没有任何分支被采用,result仍然用于决定它们不应该被采用。

于 2009-04-27T16:31:59.653 回答
2

分别用 DBL_MAX 和 DBL_MIN 初始化 myMin 和 myMax,并通过循环检查第一次摆脱。

于 2009-04-27T16:31:31.167 回答
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;
    }
}

}

于 2009-04-27T16:28:55.417 回答
1
result = [...]
if (i == 0) {
    [... do something with result ...]
}
else if (result < myMin) {

在 if() 的两个分支中,result都使用了。在第一种情况下,它被分配给一个变量,在第二种情况下,它被用于比较。所以编译器不应该发出警告。

我怀疑你可能误诊了这个问题。请你能准确地说出错误信息是什么(复制粘贴)。另外,请尝试发布可以实际编译并发出警告的最小代码段?(只是尝试这样做可能会让您发现问题)

编辑: transmogrify() 是否有可能是一个result内部使用的宏?

于 2009-04-27T16:30:49.750 回答
1

在“if”语句之前:

result = 0.0;

或其他一些价值。在使用之前将变量设置为某个值总是一种很好的形式。

于 2009-04-27T16:32:20.230 回答
1

我收到一条警告说,为 result 计算的值从未使用过,因为(理论上)可能不会选择任何 if/else 分支,并且由于我们将所有警告都视为错误,因此无法编译。如何修复此代码以避免警告?我正在为我的编译器使用 g++

始终使用用于结果的值。如果未分配,则在比较器中使用它。因此编译器有问题。

于 2009-04-27T16:34:21.537 回答
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 <= 0) 可能更清楚一些,但它在原始代码片段中也同样重要。

于 2009-04-27T16:41:34.933 回答
-1

删除第一个 else 只会影响循环中第一次运行的运行时间。我宁愿消除它。

if (i == 0) {
    myMin = result;
    myMax = result;
}
if (result < myMin) 
    myMin = result;
else if (result > myMax) 
    myMax = result;
于 2009-04-27T16:29:46.977 回答