环形缓冲区的数据结构
1.typedef struct
{
char buf[DATA_LENGTH];
char head;
char tail;
char length;
} ring_buf
或者
2.typedef struct
{
char buf[DATA_LENGTH];
char head;
char tail;
} ring_buf
1与2的区别是,1比2多了个成员length,该成员用于统计当前ring_buf的数据量,如果不用length也可以,可以通过head与tail算出数据量,使用length主要是为了方便
首先初始化ring_buf
1)读写ring_buf
当向ring_buf里的buf写入数据时tail++,如果采用数据结构1,此时还要执行length++
当从ring_buf里的buf取数据时head++, 如果采用数据结构1,此时还要执行length--
2)判断ring_buf是否满
如果采用数据结构1,只需要判断length是否等于DATA_LENGTH就可以,如果length == DATA_LENGTH为真,即说明ring_buf已满
如果采用数据结构2,由于没有length成员,需要判断(tail+1)%DATA_LENGTH == head是否为真,如果为真说明ring_buf已满, tail+1可能超过DATA_LENGTH,所以要做除模操作
3)判断ring_buf是否空
如果采用数据结构1,只需要判断length是否等于0就可以,如果length==0为真,即说明ring_buf已空
如果采用数据结构2,由于没有length成员,需要判断head == tail 是否为真,如果为真说明ring_buf已空
4)关于ring_buf循环的处理
循环有两种写法
方法1:
写数据
if(length != DATA_LENGTH) {
buf[tail] = data;
tail++;
length++;
if(tail == DATA_LENGTH)
tail=0;
}
读数据
if(length != 0) {
data = buf[head];
head++;
length--;
if(head == DATA_LENGTH)
head=0;
}
方法2:
写数据
if(((tail+1) % length) != head) {
buf[tail] = data;
tail++; //tail++的值可能大于length所以在下面做取模操作
tail = tail % length;
}
读数据
if(tail != head) {
data = buf[head];
head++; //head++的值可能大于length所以在下面做取模操作
head = head % length;
}
tail = tail % length; 与 if(tail == DATA_LENGTH) tail=0;可以互换
同理
head = head % length; 与 if(head == DATA_LENGTH) head=0;也可以互换
1.typedef struct
{
char buf[DATA_LENGTH];
char head;
char tail;
char length;
} ring_buf
或者
2.typedef struct
{
char buf[DATA_LENGTH];
char head;
char tail;
} ring_buf
1与2的区别是,1比2多了个成员length,该成员用于统计当前ring_buf的数据量,如果不用length也可以,可以通过head与tail算出数据量,使用length主要是为了方便
首先初始化ring_buf
1)读写ring_buf
当向ring_buf里的buf写入数据时tail++,如果采用数据结构1,此时还要执行length++
当从ring_buf里的buf取数据时head++, 如果采用数据结构1,此时还要执行length--
2)判断ring_buf是否满
如果采用数据结构1,只需要判断length是否等于DATA_LENGTH就可以,如果length == DATA_LENGTH为真,即说明ring_buf已满
如果采用数据结构2,由于没有length成员,需要判断(tail+1)%DATA_LENGTH == head是否为真,如果为真说明ring_buf已满, tail+1可能超过DATA_LENGTH,所以要做除模操作
3)判断ring_buf是否空
如果采用数据结构1,只需要判断length是否等于0就可以,如果length==0为真,即说明ring_buf已空
如果采用数据结构2,由于没有length成员,需要判断head == tail 是否为真,如果为真说明ring_buf已空
4)关于ring_buf循环的处理
循环有两种写法
方法1:
写数据
if(length != DATA_LENGTH) {
buf[tail] = data;
tail++;
length++;
if(tail == DATA_LENGTH)
tail=0;
}
读数据
if(length != 0) {
data = buf[head];
head++;
length--;
if(head == DATA_LENGTH)
head=0;
}
方法2:
写数据
if(((tail+1) % length) != head) {
buf[tail] = data;
tail++; //tail++的值可能大于length所以在下面做取模操作
tail = tail % length;
}
读数据
if(tail != head) {
data = buf[head];
head++; //head++的值可能大于length所以在下面做取模操作
head = head % length;
}
tail = tail % length; 与 if(tail == DATA_LENGTH) tail=0;可以互换
同理
head = head % length; 与 if(head == DATA_LENGTH) head=0;也可以互换