首页 > 解决方案 > 我怎样才能使两个值一致地相互约束?

问题描述

我有两个变量,static int16_t minstatic int16_t max

我希望它们相互约束,这样

此外,每个值都需要限制在 0 - 15 的值范围内(这些变量被声明为 int16_t,因为它们用于多种目的,除了此特定实例中的范围)。

我尝试了以下代码:

min = constrain(min, 0, max);
max = constrain(max, min, 15);

这适用于min's 的值,意思是:一旦min增加到max它不会增加超过max. 另一方面,当 的值max减小到等于 的值时min,它会不断减小这两个值,直到它们都下降到 0。

我很难弄清楚如何解决逻辑,并且会感谢任何使两个值的逻辑一致的建议,所以换句话说,我可以使用以下任一解决方案:

标签: c++arduinoconstraints

解决方案


简短的回答:封装。

你描述的是一个不变量。不变量由用户定义的数据类型通过封装私有数据来保证,并且仅向用户提供对具有不变量作为后置条件的方法的访问。

只是为了概述这个想法:

class min_max {
    int min;
    int max;
    void normalize_min() {  if (min > max) min = max; }
    void normalize_max() {  if (max < min) max = min; }

public:
    min_max(int a,int b) : min(std::min(a,b)), max(std::max(a,b)) {}
    void set_min(int x) {
       min = x;
       normalize_max();
    }
    void set_max(int x) {
       max = x;
       normalize_min();
    }
    int get_max() { return max; }
    int get_min() { return min; }
};

从课外没有办法达到的情况max < min

考虑 Yakk 对您的问题的评论。我不确定你真正想要什么,并且对于上述我假设在调用后mm.set_max(a)我们可以断言mm.get_max() == a并且只有min被调整(反之亦然set_min)。max其他解决方案也是可能的,例如,当用户尝试设置大于的 a 时,您可以抛出异常min,或者以不同的方式发出错误信号。


推荐阅读