我现在将arduino代码移植到stm32(c / c ++)。请帮助我this功能:
constrain(x, a, b)
返回
x:如果x在a和b之间
a:如果x小于a
b:如果x大于b
示例
sensVal = constrain(sensVal, 10, 150);
// limits range of sensor values to between 10 and 150
答案 0 :(得分:8)
这是一个模板版本,包括一个演示使用的完整程序(你应该能够复制并粘贴它):
#include <iostream>
template<class T>
const T& constrain(const T& x, const T& a, const T& b) {
if(x < a) {
return a;
}
else if(b < x) {
return b;
}
else
return x;
}
int main() {
int value = 10;
std::cout << constrain(value, 5, 20) << "\n" // prints "10"
<< constrain(value, 15, 20) << "\n" // prints "15"
<< constrain(value, 5, 9) << std::endl; // prints "9"
}
这可以用于operator<
的任何类型(包括所有内置数字类型,例如int
和float
)。
答案 1 :(得分:5)
对于Arduino,constrain
不是函数,它是#defined'd宏。
它在Arduino IDE中的Arduino.h中定义。
Arduino源代码是在开源许可下发布的,因此您可以阅读: - )
它的定义是:
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
哪个会在你的端口继续工作到stm32。
当然,它是一个宏,因此只是一个文本替换。因此,参数出现在源代码中,因此它们不是新的类型信息。
您可能更喜欢使用函数而不是宏,但由于您的代码是现有代码的端口,因此继续使用宏可能更简单。然后,如果原始代码得到改进或更改,那么应该减少生成新端口的工作量。
关于尝试使用类型函数或模板函数而不是宏的一个小问题是它可能会在以后引起混淆。如果尝试移植任何Arduino代码,使用函数而不是宏可能会创建新的警告,错误或错误。特别是如果原始代码使用没有匹配函数的constrain
类型或类,则会出现Arduino源中根本不存在的错误。或者更糟糕的是,类型化或模板化的函数可能会触发一些C ++类型的转换,这些转换在宏版本中不会发生。您可能会为自己留下一个小小的“陷阱”,或者将来为您的代码留下任何人。
答案 2 :(得分:1)
在Clamping (graphics)下看维基百科,看起来你可以拥有一个与类型无关的模板?
template<typename T>
T clamp(T Value, T Min, T Max)
{
return (Value < Min)? Min : (Value > Max)? Max : Value;
}