关于语句操作的 Misra 违规 10.1 (MISRA C 2012)
Misra Violation 10.1 regarding statement operations (MISRA C 2012)
我需要一段代码方面的帮助。
我有一个数组,我们称它为数组[4]。
现在我想检查这个数组中至少有 3 个元素高于阈值。 (if 语句)
例如
if(2 > ((array[0] > threshold) + (array[1] > threshold) + (array[2] > threshold) + (array[3] > threshold) ))
米斯拉在这里抱怨。 (规则 10.1 不允许的操作数运算符“+”)
有没有另一种方法可以在不检查所有可能的排列的情况下编写此 if 语句?
干杯
将那些讨厌的不可加的布尔值显式转换为整数 1/0 怎么样?:
if(2 > ((array[0] > threshold?1:0) + (array[1] > threshold?1:0) + (array[2] > threshold?1:0) + (array[3] > threshold?1:0) ))
如何将单行文件解包,可能是一个循环?它也可以更具可读性:
int check = 0;
for (int i = 0; i<4; i++) {
if (array[i] > threshold) {check++;}
}
if (check >= 3) ...
您的 if 语句实际上似乎是在测试“至少 3 个更高”与 if (2 > ...)
(至多一个?)的对比。
这个问题的核心是一个误解......布尔值 true
的值为 1
而 false
的值为 0
- 而你可以将三个布尔值加在一起。
布尔值是 true
或 false
。
从数学上讲,+
运算符对布尔值毫无意义:这就是此特定 MISRA 规则的基本原理(另请参阅解释 基本类型 的附录) ...布尔值的 C 实现如此糟糕,这无济于事。
其他答案提供了替代方案。但是有一个请求,请不要再使用 yoda 条件语句了,尤其是当你似乎用错误的方式来解释它时...... if ( 2 > ... )
甚至不是你的错误条件,它需要是 if ( 2 < ... )
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"
{
...
}
我需要一段代码方面的帮助。 我有一个数组,我们称它为数组[4]。 现在我想检查这个数组中至少有 3 个元素高于阈值。 (if 语句)
例如
if(2 > ((array[0] > threshold) + (array[1] > threshold) + (array[2] > threshold) + (array[3] > threshold) ))
米斯拉在这里抱怨。 (规则 10.1 不允许的操作数运算符“+”) 有没有另一种方法可以在不检查所有可能的排列的情况下编写此 if 语句?
干杯
将那些讨厌的不可加的布尔值显式转换为整数 1/0 怎么样?:
if(2 > ((array[0] > threshold?1:0) + (array[1] > threshold?1:0) + (array[2] > threshold?1:0) + (array[3] > threshold?1:0) ))
如何将单行文件解包,可能是一个循环?它也可以更具可读性:
int check = 0;
for (int i = 0; i<4; i++) {
if (array[i] > threshold) {check++;}
}
if (check >= 3) ...
您的 if 语句实际上似乎是在测试“至少 3 个更高”与 if (2 > ...)
(至多一个?)的对比。
这个问题的核心是一个误解......布尔值 true
的值为 1
而 false
的值为 0
- 而你可以将三个布尔值加在一起。
布尔值是 true
或 false
。
从数学上讲,+
运算符对布尔值毫无意义:这就是此特定 MISRA 规则的基本原理(另请参阅解释 基本类型 的附录) ...布尔值的 C 实现如此糟糕,这无济于事。
其他答案提供了替代方案。但是有一个请求,请不要再使用 yoda 条件语句了,尤其是当你似乎用错误的方式来解释它时...... if ( 2 > ... )
甚至不是你的错误条件,它需要是 if ( 2 < ... )
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"
{
...
}