Как я должен исправить этот код, который вызывает предупреждение «значение вычисляется не используется»? - PullRequest
0 голосов
/ 27 апреля 2009

У меня есть массив значений типа double, и мне нужно выполнить вычисление для этого массива, а затем найти минимальное и максимальное значение, полученное в результате этого вычисления. Вот в основном то, что у меня есть:

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 ]

4 голосов
/ 27 апреля 2009

Я получаю предупреждение о том, что значение, вычисленное для result, никогда не используется, потому что (теоретически) возможно, что ни одна из ветвей if / else не будет выбрана

Это не может быть причиной предупреждения, потому что result также используется в условиях if. Даже если ни одна из ветвей не занята, result все еще используется, чтобы решить, что их не следует брать.

4 голосов
/ 27 апреля 2009

Предполагая, что вам не нужно result вне цикла, вы можете объявить result внутри цикла следующим образом:

for( int i=0; i < sizeOfArray; ++i ) {
    double result = transmogrify( array[i] );
    ...
}
2 голосов
/ 27 апреля 2009

Инициализируйте myMin и myMax с DBL_MAX и DBL_MIN соответственно и избавьтесь от первого раза с помощью проверки цикла.

1 голос
/ 27 апреля 2009

Я получаю предупреждение о том, что значение, вычисленное для результата, никогда не используется, потому что (теоретически) возможно, что ни одна из ветвей if / else не будет выбрана, и поскольку мы рассматриваем все предупреждения как ошибки, это не компилируется , Как я могу исправить этот код, чтобы избежать предупреждения? Я использую G ++ для моего компилятора

Значение, используемое для результата, всегда используется. Если он не назначен, он используется в компараторе. Поэтому компилятор неисправен.

1 голос
/ 27 апреля 2009

Перед оператором if:

result = 0.0;

или другое значение. Перед использованием переменной всегда полезно установить какое-либо значение.

1 голос
/ 27 апреля 2009
result = [...]
if (i == 0) {
    [... do something with result ...]
}
else if (result < myMin) {

В обеих ветвях if () используется result. В первом случае он присваивается переменной, во втором - в сравнении. Поэтому компилятор не должен предупреждать.

Я подозреваю, что вы могли неправильно диагностировать проблему. Пожалуйста, вы можете точно сказать, что сообщение об ошибке (скопируйте и вставьте его). Кроме того, попробуйте опубликовать наименьший фрагмент кода, который вы можете скомпилировать и выдать предупреждение. (Простая попытка сделать это, вероятно, позволит вам найти проблему)

РЕДАКТИРОВАТЬ: Возможно ли, что transmogrify () является макрос, который использует result внутри?

1 голос
/ 27 апреля 2009

Я не думаю, что опубликованный код должен выдавать ошибку, если компилятор не выполняет какой-то феноменальный анализ потока. Конечно, он хорошо компилируется с 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;
    }
}

}

0 голосов
/ 27 апреля 2009

Быстрое решение может состоять в том, чтобы развернуть первую итерацию, например:

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), но это также важно и в исходном фрагменте кода. </p>

0 голосов
/ 27 апреля 2009

Удаление первого еще влияет только на время работы первого цикла в цикле. Я бы скорее исключил это.

if (i == 0) {
    myMin = result;
    myMax = result;
}
if (result < myMin) 
    myMin = result;
else if (result > myMax) 
    myMax = result;
...