微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎样才能使两个值一致地相互约束?

如何解决我怎样才能使两个值一致地相互约束?

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

我希望他们constrain彼此,以便

  • min 永远不会大于 max,并且
  • max 永远不会小于 min

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

我尝试了以下代码

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

这对 min 的值有效,意思是:一旦 min 增加max,它不会增加超过 max 的值。另一方面,当 max 的值减小到等于 min 的值时,它会不断减小两个值,直到它们都减小到 0。

我很难弄清楚如何解决逻辑问题,并且希望得到任何建议使两个值的逻辑保持一致,所以换句话说,我会接受解决方案这要么使:

  • 每个值都在推动另一个值的边界,或者
  • 每个值都是另一个值的硬约束。

解决方法

简答:封装。

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

仅概述想法:

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) .其他解决方案也是可能的,例如,当用户尝试设置大于 maxmin 或以不同方式发出错误信号时,您可以抛出异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。