Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Arduino约束函数端口_C++_Constraints_Arduino_Stm32 - Fatal编程技术网

C++ 从Arduino约束函数端口

C++ 从Arduino约束函数端口,c++,constraints,arduino,stm32,C++,Constraints,Arduino,Stm32,我现在将arduino代码移植到stm32(c/c++)。请帮助我了解功能: 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 这里是一个模板版本,包括一个完整的程序来演示使用(您应该能够复制和粘贴): #包括 模板 常数T和约束(常数T和x、

我现在将arduino代码移植到stm32(c/c++)。请帮助我了解功能:

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 

这里是一个模板版本,包括一个完整的程序来演示使用(您应该能够复制和粘贴):

#包括
模板
常数T和约束(常数T和x、常数T和a、常数T和b){
if(xstd::cout看看维基百科,看起来你可以有一个独立于类型的模板

template<typename T>
T clamp(T Value, T Min, T Max)
{
  return (Value < Min)? Min : (Value > Max)? Max : Value;
}
模板
T形夹(T值、T最小值、T最大值)
{
返回值(值<最小值)?最小值:(值>最大值)?最大值:值;
}

对于Arduino,
约束
不是一个函数,而是一个定义的宏

它在Arduino IDE中的Arduino.h中定义

Arduino源代码是在开源许可证下发布的,因此您可以阅读:-)

它的定义是:

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
#定义约束(金额、低、高)((金额)(高)?(高):(金额)))
它将在stm32的端口中继续工作

当然,它是一个宏,因此只是一个文本替换。因此参数出现在源代码中,因此它们不是新的类型信息

您可能更喜欢使用函数而不是宏,但由于您的代码是现有代码的一个端口,因此继续使用宏可能更简单。然后,如果原始代码得到改进或更改,则生成新端口的工作量应该会减少


尝试使用类型化函数或模板函数而不是宏的一个小问题是,这可能会导致以后的混淆。如果尝试移植任何Arduino代码,使用函数而不是宏可能会产生新的警告、错误或bug。特别是如果原始代码使用类型或类来约束
对于没有匹配功能的,在ARDUNO源中会有一个明显不存在的错误。或者更糟的是,类型化或模板化的函数可能会触发一些在宏版本中不发生的C++类型转换。您可能会留下一个小的“GOCHA”,或者将来的任何一个代码。琐碎-你有什么问题?是不是?这是不对的。在C++中,你必须为每个变量指定一个类型,以及每个函数的返回类型。你的参数没有类型,你的函数有返回类型<代码>空洞,这意味着它不能返回一个值。C++ 17引入了一个类似的函数——STD::CLAM。p()-任何支持C++17的编译器都应该公平地支持它。为了完整性起见,
a
可能大于
b
。要正确地约束
x
,请检查
a
b
,如果是,则交换比较。
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))