LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-07
動作環境
ideone (C)

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

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

対象のケース

qiita.png

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

code

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

  • Min設定
  • Max設定

#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)
0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1