目的
在做lvgl界面时,想用一种数据结构来创建一个缓冲区,负责保存网络通信传输过来的信息,然后一个一个去更新chart中的数据,很自然就想起来了C++中的队列,可是C语言没有显式定义这样的数据结构,怎么去实现呢?
思路
之前看韦东山老师的课程,他就用了一个环形缓冲区的概念,也是防止发生丢数据的现象,好像都是一样的意思。
关键是区分队满和队空的两种情况,因为队首==队尾不能同时代表两种情况,所以只能牺牲一个内存区间,里面是不会存放数据的。
代码
#pragma region /* 实现队列 start */
#define DEQUE_SIZE 100
typedef struct NetDataBuff{
int front;
int rear;
int data[DEQUE_SIZE];
}NetDataQueue, *PNetDataQueue;
/* 入队 */
int EnQueue(PNetDataQueue ptNetDataBuff, int x){
if ((ptNetDataBuff->rear + 1) % DEQUE_SIZE == ptNetDataBuff->front){ //队列满
return 0;
}else{
ptNetDataBuff->data[ptNetDataBuff->rear] = x;
return 1;
ptNetDataBuff->rear = (ptNetDataBuff->rear + 1) % DEQUE_SIZE;
}
}
/* 取队列头并出队 */
int OutQueue(PNetDataQueue ptNetDataBuff,int *x){
if (ptNetDataBuff->rear == ptNetDataBuff->front){ //队列空
return 0;
}else{
*x = ptNetDataBuff->data[ptNetDataBuff->front];
ptNetDataBuff->front = (ptNetDataBuff->front + 1) % DEQUE_SIZE;
return 1;
}
}
/* 计算队列长度 */
int QueueLength(PNetDataQueue ptNetDataBuff){
return ((ptNetDataBuff->rear - ptNetDataBuff->front + DEQUE_SIZE) % DEQUE_SIZE);
}
#pragma endregion /* 实现队列 end */
对结构体中的数组进行初始化
/* 1.创建结构体变量的时候进行初始化*/
static NetDataQueue g_tNetDataBufferSeries = {0,0,{0}};
/* 2.创建结构体的时候没有初始化,后面单独进行初始化 */
void NetDataInit(PNetDataQueue ptNetDataBuff){
ptNetDataBuff->front = 0;
ptNetDataBuff->rear = 0;
memset(ptNetDataBuff->data,0,sizeof(ptNetDataBuff->data));
}
what
后来发现,已经在Event那里实现了缓冲区,这里应该是不需要再搞一层了。