C
trap
#migrated

C > Min, Maxどちらからセットするのが良いかの調査

More than 1 year has passed since last update.
動作環境
ideone (C)

C++ Builder > TTrackBar > trap: Minプロパティへの代入が効かないで気になった、Min値の設定が失敗する件。

どうすれば成功するか調べた。

対象のケース

qiita.png

上記の(1)-(5)のケースでMin設定、Max設定に失敗しないこと。

code

上記のケースに対して、以下の順番で設定した場合の処理を実装してみた。

  • Min設定
  • Max設定

https://ideone.com/TzSeLZ

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

enum {
   IDX_MIN = 0,
   IDX_MAX,
};

static int s_range[][2] = {
    { -10, -5 },
    {  -5,  2 },
    {   2,  7 },
    {   7, 15 },
    {  12, 20 }
};

// テスト用の初期設定値
static const int kDefaultMin = 0;
static const int kDefaultMax = 10;

bool setMin(int setMin, int *dstMin, int *dstMax);
bool setMax(int setMax, int *dstMin, int *dstMax);

void test_group_run(void)
{
    int amin, amax;
    int num = sizeof(s_range)/sizeof(s_range[0]);

    for(int idx=0; idx < num; idx++) {
        amin = kDefaultMin;
        amax = kDefaultMax;
        bool bf1 = setMin(s_range[idx][IDX_MIN], &amin, &amax);
        bool bf2 = setMax(s_range[idx][IDX_MAX], &amin, &amax);
        printf("idx%d: (SetMin, SetMax)=(%d, %d)\n", idx+1, bf1, bf2);
    }
}

int main(void) {
    test_group_run();
    return 0;
}

bool setMin(int setMin, int *dstMin, int *dstMax)
{
    if (setMin > *dstMax) {
        return false;
    }
    *dstMin = setMin;
    return true;
}
bool setMax(int setMax, int *dstMin, int *dstMax)
{
    if (setMax < *dstMin) {
        return false;
    }
    *dstMax = setMax;
    return true;
}
run
idx1: (SetMin, SetMax)=(1, 1)
idx2: (SetMin, SetMax)=(1, 1)
idx3: (SetMin, SetMax)=(1, 1)
idx4: (SetMin, SetMax)=(1, 1)
idx5: (SetMin, SetMax)=(0, 1)

分かったこと

「ケース5の場合だけMinの設定が失敗する」ということが分かった。

Min,Max値を設定する実装では「ケース5の場合だけMaxからセットする」で対応できるだろう。

SetMaxを先にした場合
https://ideone.com/K6OtdX

run
idx1: (SetMin, SetMax)=(1, 0)
idx2: (SetMin, SetMax)=(1, 1)
idx3: (SetMin, SetMax)=(1, 1)
idx4: (SetMin, SetMax)=(1, 1)
idx5: (SetMin, SetMax)=(1, 1)