Error value computed is not used

У меня есть массив двойников, и мне нужно выполнить расчет в этом массиве, а затем найти минимальное и максимальное значения, полученные в результате этого расчета. Вот в основном то, что у меня: ... Вопрос по поводу: 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

Изменить: я не понимаю голосов против, но теперь у меня все работает. Спасибо всем, что нашли время мне помочь.

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

for( int i=0; i < sizeOfArray; ++i ) {
    double result = transmogrify( array[i] );
    ...
}

ответ дан 27 апр.

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

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

ответ дан 27 апр.

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

ответ дан 27 апр.

result = [...]
if (i == 0) {
    [... do something with result ...]
}
else if (result < myMin) {

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

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

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

ответ дан 27 апр.

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

result = 0.0;

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

ответ дан 27 апр.

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

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

ответ дан 27 апр.

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

}

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

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

ответ дан 27 апр.

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

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

ответ дан 27 апр.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c++
g++

or задайте свой вопрос.

Bug 34212
spurious warning: value computed is not used

Summary:

spurious warning: value computed is not used

Status: RESOLVED
FIXED

Alias:

None

Product:

gcc

Classification:

Unclassified

Component:

middle-end

(show other bugs)

Version:

4.3.0

Importance:

P3
normal

Target Milestone:

Assignee:

Not yet assigned to anyone

URL:


Keywords:

diagnostic

Depends on:


Blocks:


Reported: 2007-11-24 02:16 UTC by Pawel Sikora
Modified: 2016-10-25 19:49 UTC
(History)

CC List:

4
users

(show)

See Also:

Host:

Target:

Build:

Known to work:

6.2.1

Known to fail:

4.0.0, 4.0.4, 4.1.2, 4.2.0, 4.3.0, 4.4.0, 4.5.0, 4.6.0

Last reconfirmed:

2008-03-13 05:30:28


Attachments

Test case


(230 bytes,
text/plain)

2012-03-16 13:38 UTC,

Jonathan Liu

Details

View All

Add an attachment
(proposed patch, testcase, etc.)

Note
You need to
log in
before you can comment on or make changes to this bug.


if(&base1[j] <= &base2[k])

&base1[j] and &base2[k] are the addresses of the elements. You do not want to compare the addresses. To compare the values of the elements, use base1[j] <= base2[k].

&array[i] == &base1[j++];

== is comparison, not assignment. And, again, &array[i] is an address, not the array element. To assign base1[j] to array[i] and increment j, use array[i] = base1[j++];. Note the =, not ==. This is what the compiler was warning you about; == does do anything besides produce a 0 or 1 result indicating whether the comparison is false or true. So the compiler warns you this is a statement does nothing. With =, the statement assigns a value, so it is doing something, and the compiler does not warn you.

Also, observe you want to assign to the same thing regardless of whether the if condition is true or false, like this:

Student t;
if (base1[j] <= base2[k])
    t = base1[j++];
else
    t = base2[k++];
array[i] = t;

C has an operator for this, the conditional operator, ? and ::

array[i] = base1[j] <= base2[k] ? base1[j++] : base2[k++];

That evaluates base1[j] <= base2[k]. Then, if it is true, base1[j++] is used. If it is false, base2[k++] is used. The unused operand is not evaluated, not even the increment in j++ or k++. The result of the conditional operator is then assigned to array[i].

That will get your code compiling and shorten it considerably—and it will be clearer to people who are familiar with the conditional operator.

You also need to fix the loop bound; i <= total should likely be i < total.

However, you have another problem. One of j or k will reach the end of its array before i reaches total. Then, in base1[j] <= base2[k], one of the operands will be outside its array. You need to either terminate the loop before that happens or add code to deal with it inside the loop.

One solution is:

int i = 0, j = 0, k = 0;

// While both arrays have elements remaining, merge them.
while (j < nel1 && k < nel2)
    array[i++] = base1[j] <= base2[k] ? base1[j++] : base2[k++];

// Finish elements left in base1.
while (j < nel1)
    array[i++] = base1[j++];

// Finish elements left in base2.
while (k < nel2)
    array[i++] = base2[k++];

Понравилась статья? Поделить с друзьями:
  • Error value 2147942405
  • Error validation footer
  • Error validation failure
  • Error validation chart metadata is required
  • Error validating steam account please try again esea