# How do I create boundaries for the possible values of an integer? [closed]

I want to create an integer whose total value cannot go beyond a range of numbers when added to and subtracted from. For example, if the "total_value" started at 0 (of a total possible range between -5 and 5), and then, using a button that added 1 to the total value, I got to 5, if I was to press it again it would not go to six but either reset to 5 or block another input of +1.

How would I go about achieving something to this effect?

Liam

• This is about Arduino, not a programming school. – user31481 Jan 23 '18 at 8:59

You are probably looking for the constrain() macro (an existing implantation of clamp logic, credit goes to @Edgar Bonet)

``````value = constrain(value + input, -5, 5);
``````

If you get tired of writing `constrain()` you can even wrap it in a new type (which might be over-engeneering), producing something like following(code not tested)

``````template<typename T>
struct BoundValue {
T value;
const T vmin, vmax;
//similar for other operators +,/,-=,...
decltype(*this)& operator+=(T operand) { value = constrain(value + operand, vmin, vmax); return *this; }
operator T() const { return value; }
BoundValue(const T& vmin, const T& vmax) : vmin(vmin), vmax(vmax) {}
BoundValue& operator=(const T& other) { value = constrain(other, vmin, vmax); return *this; }
};
``````

and use like variable of its argument type

``````BoundValue<int> val(-5, 5);
val += 6;//val = 5
``````
• No need to write `clamp()`: you can use `constrain()`. – Edgar Bonet Jan 23 '18 at 8:52
• Total overkill. – user31481 Jan 23 '18 at 8:55
• @EdgarBonet good catch, kind of unusual name choice by Arduino though(at least for my computer graphics background) - no wonder I had trouble to finding it. – wondra Jan 23 '18 at 9:17
• @LookAlterno kind of agree, there are people who love shiny code though (myself included), its interesting for fun projects. For serious ones not so much due to the other issue being its super-easy to introduce errors when not being careful with c++ constructors/operator overloading. The clamp/constraint is definitely the way to go though. – wondra Jan 23 '18 at 9:30
• @wondra. You have to give an answer at the poster's level. If he can't deal with a normal boundary check, an answer with Template, references, operator overload and whatever is not going to work for him. NickGammon gave an answer more appropiate to the poster's habilities. – user31481 Jan 23 '18 at 9:41

``````total_value = total_value + 1;
if (total_value > 5)
total_value = 5;
``````

And for subtracting:

``````total_value = total_value - 1;
if (total_value < -5)
total_value = -5;
``````

You may find a C or C++ tutorial very helpful.

``````if (total_value < 5)
total_value++;
``````

And for subtracting:

``````if (total_value > -5)
total_value--;
``````
• Thank you for your response, I did try the first method before I posted but I must have mucked something up because it didn't work. – Liam Jan 23 '18 at 4:56
• `if (++total_value > 5) total_value = 5` and `if (--total_value < -5 ) total_value = -5`. The use of prefix operators can achieve the same effect and make the code more concise. – AJD Jan 23 '18 at 5:37
• @AJD. Nick's way is safer. Using ++/-- inside expressions is going to give headaches sooner or later. – user31481 Jan 23 '18 at 8:59

You can not create a number with arbitrary upper and lower limits. It is common in the C language to create an integer comprised of 16 bits. Such an integer has a minimum of:

``````-(2^15) = -32768
``````

...and maximum of:

``````(2^15) - 1 = +32767
``````

Instead, after pressing the positive button, consider testing if "total_value" is 5 and skipping adding 1 to "total_value" if TRUE. Conversely, after pressing the negative button, consider testing if "total_value" is -5 and skipping subtracting 1 from "total_value" if TRUE.