簡體   English   中英

我怎樣才能使兩個值一致地相互約束?

[英]How can i make two values constrain each other consistently?

我有兩個變量, static int16_t minstatic int16_t max

我想讓他們互相約束,這樣

  • min永遠不會大於max ,並且
  • max永遠不會小於min

此外,每個值都需要限制在 0 - 15 的值范圍內(變量被聲明為 int16_t,因為除了這個特定實例的范圍之外,它們還有多種用途)。

我嘗試了以下代碼:

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

這適用於min的值,意思是:一旦min增加到max它就不會增加超過max的值。 另一方面,當max的值減小到等於min的值時,它會不斷減小兩個值,直到它們都減小到 0。

我很難弄清楚如何解決邏輯,並且希望能夠使邏輯對兩個 values 保持一致的任何建議,因此換句話說,我可以使用以下解決方案:

  • 每個值都在推動另一個值的邊界,或
  • 每個值都是另一個的硬約束。

簡短的回答:封裝。

你所描述的是一個不變量。 不變量由用戶定義的數據類型通過封裝私有數據來保證,並且只為用戶提供對將不變量作為后置條件的方法的訪問。

僅概述想法:

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 )。 其他解決方案也是可能的,例如,當用戶嘗試設置大於minmax或以不同方式發出錯誤信號時,您可以拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM