動作環境
ideone (C)
C++ Builder > TTrackBar > trap: Minプロパティへの代入が効かないで気になった、Min値の設定が失敗する件。
どうすれば成功するか調べた。
対象のケース
上記の(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)