从Arduino中约束函数端口

Sev*_*ays 3 c++ constraints arduino stm32

我现在将arduino代码移植到stm32(c/c ++).请帮我这个功能:

constrain(x, a, b)
Run Code Online (Sandbox Code Playgroud)

返回

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 
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 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"
}
Run Code Online (Sandbox Code Playgroud)

这可以用于任何具有operator<(包括所有内置数字类型,例如intfloat)的类型.


gbu*_*mer 6

对于Arduino,constrain它不是一个函数,它是一个#define'd宏.

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

Arduino源代码是在开源许可下发布的,所以你可以阅读它:-)

它的定义是:

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
Run Code Online (Sandbox Code Playgroud)

哪个会在您的端口继续工作到stm32.

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

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

关于尝试使用类型函数或模板函数而不是宏的一个小问题是它可能会在以后引起混淆.如果尝试移植任何Arduino代码,使用函数而不是宏可能会创建新的警告,错误或错误.特别是如果原始代码使用的类型或类constrain没有匹配的函数,则会出现Arduino源中根本不存在的错误.或者更糟糕的是,类型化或模板化的函数可能会触发一些C++类型的转换,这些转换在宏版本中不会发生.您可能会为自己留下一个小小的"陷阱",或者将来为您的代码留下任何人.