Для l oop вместо условия long if, чтобы сократить время вычислений - PullRequest
0 голосов
/ 06 мая 2020

У меня есть код, похожий на показанный ниже. Я упростил его, чтобы донести свою точку зрения. Он содержит массив. В первой части каждое значение массива за вычетом определенного значения сравнивается со значением маржи. Если все условия соблюдены, µ C должен прекратить выполнение простой функции. В противном случае µ C должен запускать вычисление со значениями массива. В этом вычислении есть несколько умножений, которые выполняются для каждого значения.

uint32_t value[8];
uint16_t othervalue;

if ((value[0] < othervalue && value[1] < othervalue && value[2] < othervalue && value[3] < othervalue && value[4] < othervalue && value[5] < othervalue && value[6] < othervalue && value[7] < othervalue)
{
    othervalue = 100;
    simplefunction();
}
else
{
    calculatewithallvalues(values);
}

Я заметил, что, вероятно, я мог бы улучшить код. Вычисления в "else" должны выполняться только в том случае, если условие для этого значения c не выполняется. Поэтому в некоторых случаях расчет не нужно выполнять для каждого значения. Я придумал другой подход, используя для l oop. Однако этот код длиннее и, возможно, более запутан. Дополнительное значение if l oop в конце необходимо для учета возможности того, что все значения соответствуют условию.

uint32_t value[8];
uint16_t othervalue;
uint8_t calc_needed = 0;
int i;
for (i=0; i <7; i++)
{
    if (value[i] < othervalue)
    {
        //do nothing
    }
    else
    {
        calculatewithvalue(values[i]);
        calc_needed = 1;
    }
if (calc_needed == 0)
{
    othervalue = 100;
    simplefunction();
}

Какое решение лучше или есть третье решение?

1 Ответ

0 голосов
/ 06 мая 2020

Есть третье решение:


for(i=0; i < 7; i++) {
    if (value[i] < othervalue ) continue;
    break;
    }

if (i == 7) { // loop completed; all values were below othervalue
    othervalue = 100;
    simplefunction();
    }
else    {
    calculatewithallvalues(values);
    }
...