Нарушение Misra 10.1 в отношении операций с операторами (MISRA C 2012)

мне нужна помощь с куском кода. У меня есть массив, назовем его массивом[4]. Теперь я хочу проверить, что по крайней мере 3 элемента этого массива выше порога. (если утверждение)

E.g.

if(2 > ((array[0] > threshold) + (array[1] > threshold) + (array[2] > threshold) + (array[3] > threshold) ))

Здесь Мишра жалуется. (Правило 10.1 Недопустимый оператор операнда +) Есть ли другой способ закодировать этот оператор if без проверки всех возможных перестановок?

Ваше здоровье


person HS94    schedule 08.01.2021    source источник
comment
cond ? 1 : 0 преобразует логическое значение cond в целое число.   -  person stark    schedule 08.01.2021
comment
if ( 2 > ... ) обнаружит менее 2 и не не менее 3 элементов этого массива выше порогового значения. У тебя Йода не в ту сторону!   -  person Andrew    schedule 10.01.2021


Ответы (4)


Как насчет явного преобразования этих надоедливых недобавляемых логических значений в целое число 1/0?:

if(2 > ((array[0] > threshold?1:0) + (array[1] > threshold?1:0) + (array[2] > threshold?1:0) + (array[3] > threshold?1:0) ))
person barny    schedule 08.01.2021
comment
Хотя должно быть if ( 2 **<** ... )... - person Andrew; 10.01.2021
comment
Это плохая идея, потому что операторы ?: содержат точки следования, которых не было в исходном коде. Вы сделали ужасно написанный код еще хуже... теперь он стал еще менее читаемым, а также потенциально медленнее, потому что вы применяете дополнительное ветвление. - person Lundin; 12.01.2021

Как насчет распаковки однострочника, возможно, в цикл? Это могло бы быть и более читабельным:

int check = 0;
for (int i = 0; i<4; i++) {
  if (array[i] > threshold) {check++;}
}
if (check >= 3) ...

Ваш оператор if на самом деле проверяет что-то еще, по крайней мере, 3 выше против if (2 > ...) (максимум один?).

person dratenik    schedule 08.01.2021

В основе этого вопроса лежит недоразумение... что логическое значение true имеет значение 1, а false равно 0, и что вы можете сложить три логических значения вместе.

Логическое значение равно true или false.

Математически оператор + не имеет смысла с логическим значением: и это является обоснованием для этого конкретного правила MISRA (см. также Приложение, объясняющее Основные типы)... не помогает то, что реализация C логического настолько сломан.

Другие ответы предлагают альтернативы. Но одна просьба, избавьте нас от условностей йода, тем более, что вы, кажется, неправильно поняли свое объяснение ... if ( 2 > ... ) даже не ваше ложное условие, оно должно быть if ( 2 < ... )

person Andrew    schedule 10.01.2021

Предупреждение MISRA связано с тем, что вы пытаетесь выполнять арифметические действия с типами, которые по сути являются логическими, что является бессмысленным.

Но это наименьшая из ваших проблем, эта строка кода написана просто ужасно, до такой степени, что можно заподозрить преднамеренное запутывание. Он не проверяет, что по крайней мере 3 элемента этого массива выше порогового значения. Его нельзя спасти.

Один из способов переписать этот код (совместимый с MISRA-C: 2012):

uint32_t above_count=0;
for(size_t i=0; i<N; i++) // where N is some named variable for the amount of items / array size etc
{
  if(array[i] > threshold)
  {
    above_count++;
  }
}

if(above_count >= 3) // "check that at least 3 elements of this array are taller than a threshold"
{
  ...
}
person Lundin    schedule 12.01.2021