リミッタ付きの単純なステッパコントロールを作成しました。リミッタ付きステッパコントロールの作成
一般的にうまくいくようです。しかし、リミッタの範囲をnumeric_limits<float>::min()
からnumeric_limits<float>::max()
にしようとすると、値が負になると正しく動作しません。
ここに私の完全なテストコードがあります。
#include <iostream>
using namespace std;
class Stepper {
public:
Stepper(float from, float to, float value, float interval){ //limited range
mFrom = from;
mTo = to;
mValue = value;
mInterval = interval;
}
Stepper(float value, float interval){ //limitless range version
mFrom = numeric_limits<float>::min();
mTo = numeric_limits<float>::max();
mValue = value;
mInterval = interval;
}
float getCurrentValue() {
return mValue;
}
float getDecreasedValue() {
if (mFrom < mTo)
mValue -= mInterval;
else
mValue += mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
float getIncreasedValue() {
if (mFrom < mTo)
mValue += mInterval;
else
mValue -= mInterval;
mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo));
return mValue;
}
private:
float clamp(float value, float min, float max) {
return value < min ? min : value > max ? max : value;
}
float mFrom, mTo, mValue, mInterval;
};
int main(int argc, const char * argv[]) {
bool shouldQuit = false;
// Stepper stepper(-3, 3, 0, 1); //this works
Stepper stepper(0, 1); //this doesn't work when the value becomes negative
cout << "step : " << stepper.getCurrentValue() << endl;
while (!shouldQuit) {
string inputStr;
cin >> inputStr;
if (inputStr == "-") //type in '-' decrease the step
cout << "step : " << stepper.getDecreasedValue() << endl;
else if (inputStr == "+") //type in '+' increase the step
cout << "step : " << stepper.getIncreasedValue() << endl;
else if (inputStr == "quit")
shouldQuit = true;
}
return 0;
}
マイクラスのコンストラクタは、最小制限された値(これも最大であることができる)
- ている4つの引数を必要とします値
- ステップ間隔
また、コンストラクタは
- のみ2引数初期値
- ステップの間隔
このケースを取ることができ、リミッタnumeric_limits<float>::min()
からnumeric_limits<float>::max()
の範囲。
この場合、値が負になると1.17549e-38
が返され、numeric_limits<float>::min()
と同じ値になります。
これを修正することは可能ですか? アドバイスやガイダンスをいただければ幸いです!
これは本当に役に立ちます。どうもありがとうございます! –