Ограничение функции порта от Arduino - PullRequest
2 голосов
/ 20 января 2012

Я сейчас портирую код arduino на stm32 (c / c ++). Пожалуйста, помогите мне с этой функцией:

constrain(x, a, b)

Возвращает

x: если x находится между a и b

a: если x меньше

b: если x больше, чем b

Пример

sensVal = constrain(sensVal, 10, 150);

// limits range of sensor values to between 10 and 150 

Ответы [ 3 ]

8 голосов
/ 20 января 2012

Здесь шаблон-версия, включающая полную программу для демонстрации использования (вы должны быть в состоянии скопировать и вставить ее):

#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).

6 голосов
/ 16 марта 2012

Для Arduino constrain не является функцией, это макрос # define'd.

Он определен в Arduino.h в Arduino IDE.

Исходный код Arduino выпускается под лицензией Open Source, поэтому вы можете прочитать его: -)

Это определение:

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))

, которое будет продолжать работать вваш порт на stm32.

Конечно, это макрос, и поэтому это просто текстовая замена.Следовательно, параметры появляются в вашем исходном коде, поэтому они не являются новой информацией о типах.

Вы можете предпочесть использовать функции, а не макросы, но, поскольку ваш код является портом существующего кода, продолжить может быть прощеиспользовать макрос.Затем, если исходный код улучшен или изменен, должно быть меньше работы для создания нового порта.

Небольшая проблема, связанная с попыткой использовать типизированные функции или функции шаблона, а нечем макрос, это может вызвать путаницу позже.Использование функций вместо макроса может привести к появлению новых предупреждений, ошибок или ошибок, если вы попытаетесь перенести любой код Arduino.В частности, если исходный код использует типы или классы для constrain, для которых у вас нет соответствующей функции, будет ошибка, которой явно нет в исходном коде Arduino.Или, что еще хуже, типизированная или шаблонная функция может запускать некоторые преобразования типов C ++, которые не происходят в макропрограмме.Вы можете оставить небольшую «погрешность» для себя или для того, кто захочет взять ваш код в будущем.

1 голос
/ 02 марта 2012

Глядя на Википедию под Зажим (графика) , похоже, что у вас может быть независимый от типа шаблон?

...