c++ - 我怎样才能使两个值一致地相互约束?
问题描述
我有两个变量,static int16_t min
和static int16_t max
。
我希望它们相互约束,这样
min
永远不会大于max
,并且max
永远不会低于min
。
此外,每个值都需要限制在 0 - 15 的值范围内(这些变量被声明为 int16_t,因为它们用于多种目的,除了此特定实例中的范围)。
我尝试了以下代码:
min = constrain(min, 0, max);
max = constrain(max, min, 15);
这适用于min
's 的值,意思是:一旦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
)。max
其他解决方案也是可能的,例如,当用户尝试设置大于的 a 时,您可以抛出异常min
,或者以不同的方式发出错误信号。
推荐阅读
- node.js - Node Sass 还不支持你当前的环境:Linux Unsupported architecture (arm) with Node.js 8.x
- promise - Promise 不等待 FTP 流上的解析
- r - 如何在符合 SAS 的 R 中运行混合效应逻辑纵向模型?
- python - 无法登录 Heroku 部署的应用程序,但可以在本地登录
- vba - 将工作表 1 A 列中的值匹配到工作表 2 A 列,如果未找到 A 值,则删除该行
- vba - 设置打印 VBA 的列宽
- r - 在神经网络 mlp r 上使用 wheights
- .htaccess - mod_rewrite 正在影响 $_GET
- excel - 刷新 Excel 表格过滤器和使用 VBA 排序时出错
- android - 是否可以将应用程序从 Playstore 中删除,但稍后恢复?