#include <stdlib.h>
#include <stdio.h>
/*
Rb:ring buffer
*/
void help(void)
{
printf("format: ring_buffer buffer_size\n");
}
typedef struct
{
int data;
}MyData;
#define true 1
#define false 0
#define success 1
#define fail 0
typedef struct{
int size;
int start;
int end;
MyData *data;
}Rb;
bool RbInit(Rb *RbPtr , int RbSize)
{
if(NULL == (RbPtr->data = (MyData *)calloc(RbSize ,sizeof(Rb))))
{
printf("calloc memory fail\n");
return fail;
}
RbPtr->size = RbSize;
RbPtr->start = 0;
RbPtr->end = 0;
return success;
}
bool RbDestroy(Rb *RbPtr)
{
free(RbPtr->data);
return success;
}
bool RbIsFull(Rb *RbPtr)
{
if(0 == RbPtr->start){
if((RbPtr->size-1) == RbPtr->end){
return true;
}
}else{
if( (RbPtr->start - 1) == RbPtr->end){
return true;
}
}
return false;
}
bool RbIsEmpty(Rb *RbPtr)
{
if(RbPtr->end == RbPtr->start ){
return true;
}
return false;
}
bool RbWriteData(Rb *RbPtr , MyData *data)
{
if(true == RbIsFull(RbPtr)){
return fail;
}
RbPtr->data[RbPtr->end] = *data;
RbPtr->end++;
if(RbPtr->end >= RbPtr->size){
RbPtr->end = 0;
}
return success;
}
bool RbReadData(Rb *RbPtr , MyData *data)
{
if(true == RbIsEmpty(RbPtr)){
return fail;
}
*data = RbPtr->data[RbPtr->start];
RbPtr->start++;
if(RbPtr->start >= RbPtr->size){
RbPtr->start = 0;
}
return success;
}
int RbDataNum(Rb *RbPtr)
{
if(true == RbIsEmpty(RbPtr)){
return 0;
}else if(true == RbIsFull(RbPtr)){
return (RbPtr->size - 1);
}else{
if(RbPtr->start > RbPtr->end){
return (RbPtr->end + RbPtr->size - RbPtr->start);
}else{
return (RbPtr->end - RbPtr->start);
}
}
}
int main(int argc, char* argv[])
{
int RbSize , i=0;
Rb Buffer;
MyData data;
if(2 != argc){
help();
return fail;
}
RbSize = atoi(argv[1]);
RbInit(&Buffer , RbSize);
//only write
#if 0
printf("===step1 only write===\n");
for(i=0 ;i<RbSize+1 ;i++){
if(false == RbIsFull(&Buffer)){
data.data = i;
RbWriteData(&Buffer , &data);
}else{
break;
}
}
printf("Rb data number=%d\n",RbDataNum(&Buffer));
for(i=0 ;i<RbSize ;i++){
printf("Rb_%d:%d\n",i , Buffer.data[i].data);
}
#endif
//write , read
printf("===step2 write read===\n");
for(i=0 ;i<RbSize+3 ;i++){
if(false == RbIsFull(&Buffer)){
data.data = i;
RbWriteData(&Buffer , &data);
}else{
break;
}
if(0 == (i%3)){
RbReadData(&Buffer , &data);
printf("@@@ cb read data = %d\n",data.data);
}
}
printf("Rb data number=%d start=%d end=%d\n",RbDataNum(&Buffer) ,Buffer.start , Buffer.end);
for(i=0 ;i<RbSize ;i++){
printf("Rb_%d:%d\n",i , Buffer.data[i].data);
}
RbDestroy(&Buffer);
return success;
}
我只會這種寫法,加減用吧.
下載:
https://drive.google.com/file/d/0B8hm-I2M8BD7OGd0NVl4Ny0zWTg/edit?usp=sharing
沒有留言:
張貼留言