Использование функции constrain

Liske
Offline
Зарегистрирован: 27.06.2016

Всех приветствую. У меня возник вопрос, по использованию функции constrain.  Корректно ли так ? : 

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te = constrain(te,2,99)- boost_tps_st);     // Boost at trottle

Или нужно прописывать constrain отдельной строкой ? : 

te = constrain(te,2,99)- boost_tps_st);

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te - boost_tps_st);     // Boost at trottle

 

Liske
Offline
Зарегистрирован: 27.06.2016

Задача оганичить нижнее значение переменной "te", только для этой одной формулы. Для остальныйх параметров, в которых используется "tе", значения 0-99. Может быть есть более подходящий способ это реализовать ? На пример с помощю функции "max" ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Liske пишет:

Всех приветствую. У меня возник вопрос, по использованию функции constrain.  Корректно ли так ? : 

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te = constrain(te,2,99)- boost_tps_st);     // Boost at trottle

Можно и так, но Вы должны понимать, что побочный эффект такой записи - переменная te получит значение, которое можно потом использовать.

Liske пишет:

Или нужно прописывать constrain отдельной строкой ? : 

te = constrain(te,2,99)- boost_tps_st);

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te - boost_tps_st);     // Boost at trottle

Можно и так, если баланс скобок нормально соблюсти, а то у Вас на одну закрывающую больше.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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

Разумеется - выбирать автору, не настаиваю.

 

Liske
Offline
Зарегистрирован: 27.06.2016

ЕвгенийП пишет:

Liske пишет:

Всех приветствую. У меня возник вопрос, по использованию функции constrain.  Корректно ли так ? : 

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te = constrain(te,2,99)- boost_tps_st);     // Boost at trottle

Можно и так, но Вы должны понимать, что побочный эффект такой записи - переменная te получит значение, которое можно потом использовать.

Liske пишет:

Или нужно прописывать constrain отдельной строкой ? : 

te = constrain(te,2,99)- boost_tps_st);

Setpoint_11 = Setpoint_1/(boost_tps_f-boost_tps_st)*(te - boost_tps_st);     // Boost at trottle

Можно и так, если баланс скобок нормально соблюсти, а то у Вас на одну закрывающую больше.

 

Для меня главное, что бы в работе программы не было сбоев, из за не корректно написаных функций.

Со скобками да, просто опечатка, когда сообщение писал. В коде компелятор бы такое не пропустил бы..)

Сейчас в коде используется первый вариант и врде бы все работает нормально.. 

Liske
Offline
Зарегистрирован: 27.06.2016

ЕвгенийП пишет:

Можно и так, но Вы должны понимать, что побочный эффект такой записи - переменная te получит значение, которое можно потом использовать.

 

Этот фрагмент находиться в самом конце програмы. В новом цикле, переменная ТЕ обновляется до целого значения. По крайней мере выглядит именно так. 

А есть какой то способ, локально, в рамках одной формулы, ограничить значение переменной ? Кроме создания новой переменной..

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

x=constrain(x,min,max); и где тут новая переменная?

Liske
Offline
Зарегистрирован: 27.06.2016

Mr.Privet пишет:
x=constrain(x,min,max); и где тут новая переменная?
 

Тут ее нет, но создать можно.. Что то типа: et_2=constrain(et,min,max); И обьявить ее отдельно..

Так будет работать ? Функция constrain затронет только et_2, или et тоже ? Или так вообще делать нельзя ??

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Функция constrain работает так: ты ей даешь 3 значения:x, min, max, а она тебе выдает одно, если х < min то это будет min, если x > max то это будет max, если min<=x<=max то это будет x. Никаких переменных она не трогает, переменные ты ей говоришь трогать сам когда какую либо переменную приравниваешь к этой функции

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Liske пишет:

 Функция constrain затронет только et_2, или et тоже ? Или так вообще делать нельзя ??

А Вы посмотрите на неё. Это даже не функция - это макрос, определённый в arduino.h вот так:

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