#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
沒有留言:
張貼留言