开源一个有限范围计数器模块。c语言的。 可以用于单片机
这个类的用途是 实现一个小范围(比如从0~314,或者-100到+100)的整数,可以智能++ --操作。 超过范围可以不再增长(可以理解为上饱和,或者下饱和)或者回到另外一头。(由变量bool autoZero决定)
使用本模块,可以闭着眼睛加加减减,数据绝对不会超出上限和下限。
如果要获得当前数值,只要读取value变量就可以了。
使用前,要用构造函数RangeInt_construct() 设置一下struct RangeInt
void RangeInt_construct (struct RangeInt* this,bool autoZero,int vmax,int vmin);
构造函数,运行的时候包括Vmax本数,
数值范围在 vmin<=x<=Vmax
this是对象指针
bool autoZero ==true,表示加加减减的时候,超过范围回到另外一头。
==false表示超过范围可以不再增长(可以理解为上饱和,或者下饱和)
本模块没有动态申请内存,所以没有析构函数
注意,本程序是用于c语言,不是c++哦
#ifndef _RangeInt_H
#define _RangeInt_H
//-----------------------------------------------------
/*
这个类的用途是 实现一个小范围的整数,可以智能++ --操作。
模块建立于 2021/2/25 16:59
*/
#include "project_config.h"
//#include ".h"
//#include ".h"
//-----------------------------------------------------
//using namespace std;
//#include <string>
//#include <vector>
//-----------------------------------------------------
typedef struct RangeInt
{
int value; //需要加减的那个数值
bool autoZero; //==true,加减到头后,value就跳到另外一头。==false,加减到头后,数值不再增长或者下降(可以理解为上饱和,或者下饱和)
int mmax; //这个数值的上限
int mmin; //这个数值的下限
}RangeInt; //本模块所有功能都基于这个数据结构
//-----------------------------------------------------
void RangeInt_construct (struct RangeInt* this,bool autoZero,int vmax,int vmin); //构造函数,运行的时候包括Vmax本数
//void RangeInt_set (struct RangeInt* this,bool autoZero,int vmax,int vmin);
void RangeInt_set_zero(struct RangeInt* this);
void RangeInt_set_min(struct RangeInt* this);
void RangeInt_inc(struct RangeInt* this); //加一
void RangeInt_dec(struct RangeInt* this); //减一
void RangeInt_get_value_as_String(struct RangeInt* this,char* str); //以字符串方式返回当前数值
void RangeInt_setValue(struct RangeInt* this,int Value);
void RangeInt_incN(struct RangeInt* this,int n); //一次增加N
void RangeInt_decN(struct RangeInt* this,int n);//一次减小N
void RangeInt_toMax(struct RangeInt* this);
void RangeInt_toMin(struct RangeInt* this);
void RangeInt_setPercentage(struct RangeInt* this,float percentage); //设置value为当前区间的百分比
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
// class RangeInt
// {
// public:
// int value;
// RangeInt (); //构造函数
// RangeInt (bool autoZero,int vmax,int vmin=0) ; //构造函数 autoZero表示数字到了最大值是归零还是保持最大值
// RangeInt (int vmax,int vmin=0) ;
// ~RangeInt (); //析构函数
// void set(bool autoZero,int vmax,int vmin);
// void set_zero();
// RangeInt operator++ ();
// RangeInt operator-- ();
// void inc ();
// void dec ();
// std::string get_value_as_stdString();
//
// private:
// bool autoZero;
// int mmax;
// int mmin;
// void init (int a,int b);
// };
//-----------------------------------------------------
#endif
以下是他的主代码
//-----------------------------------------------------
/*
该模块著作权:
模块建立于 2021/2/25 16:59
*/
//-----------------------------------------------------
#include "RangeInt.h"
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
void RangeInt__init(struct RangeInt* this,int a,int b)
{
this->value=0;
this->mmin=b;
this->mmax=a;
this->autoZero=false;
}
//-----------------------------------------------------
void RangeInt_construct (struct RangeInt* this,bool autoZero,int vmax,int vmin)
{
RangeInt__init(this,vmax,vmin);
this->autoZero=autoZero;
}
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
void RangeInt_setValue(struct RangeInt* this,int Value)
{
int a=max(Value,this->mmin);
a=min(a,this->mmax);
this->value=a;
}
//-----------------------------------------------------
//void RangeInt_set(struct RangeInt* this,bool autoZero,int vmax,int vmin)
//{
// this->value=vmin;
// this->mmin=vmin;
// this->mmax=vmax;
// this->autoZero=autoZero;
//}
//-----------------------------------------------------
void RangeInt_set_zero(struct RangeInt* this)
{
this->value=0;
}
void RangeInt_set_min(struct RangeInt* this)
{
this->value=this->mmin;
}
//-----------------------------------------------------
void RangeInt_inc(struct RangeInt* this)
{
if(this->value<this->mmax)
this->value++;
else
{
if(this->autoZero)
{
this->value=this->mmin;
}
else
{
this->value=this->mmax;
}
}
}
//-----------------------------------------------------
void RangeInt_dec(struct RangeInt* this)
{
if(this->value>this->mmin)
this->value--;
else
{
if(this->autoZero)
{
this->value=this->mmax;
}
else
{
this->value=this->mmin;
}
}
}
//-----------------------------------------------------
//-----------------------------------------------------
void RangeInt_get_value_as_String(struct RangeInt* this,char* str)
{
int_2_String(str,this->value);
}
//-----------------------------------------------------
void RangeInt_incN(struct RangeInt* this,int n)
{
int a=this->value;
a+=n;
RangeInt_setValue(this,a);
}
//-----------------------------------------------------
void RangeInt_decN(struct RangeInt* this,int n)
{
int a=this->value;
a-=n;
RangeInt_setValue(this,a);
}
//-----------------------------------------------------
void RangeInt_toMax(struct RangeInt* this)
{
RangeInt_setValue(this,this->mmax);
}
//-----------------------------------------------------
void RangeInt_toMin(struct RangeInt* this)
{
RangeInt_setValue(this,this->mmin);
}
//-----------------------------------------------------
void RangeInt_setPercentage(struct RangeInt* this,float percentage)
{
float fm=this->mmax;
float ps=percentage*fm;
int a=(int)(ps+0.5f);
RangeInt_setValue(this,a);
}
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------