リングバッファのサンプルプログラムです。
コード
ringbuff.c
#include <stdio.h>
#define BUFFSIZE (20)
int widx=0,ridx=0;
int buffer[BUFFSIZE];
int bufferfull=0;
int put_data(int data) {
if (bufferfull) return(-1); // BUFFER FULL
buffer[widx]=data;
widx=(widx+1)%BUFFSIZE;
if (widx==ridx) bufferfull=1;
return 1;
}
int get_data() {
int data;
if ((ridx==widx) && (bufferfull==0)) return(-1); // BUFFER EMPTY
bufferfull=0;
data=buffer[ridx];
ridx=((ridx+1)%BUFFSIZE);
return data;
}
//
// ここからテスト
//
int test()
{
int data;
// test for normal use
printf("*** test for normal use ****\n");
for(int i=0;i<10;i++) {
data=i;
put_data(data);
printf("データ書き込み data=%d \n",data);
}
printf("widx=%d ridx=%d\n",widx,ridx);
for(int i=0;i<10;i++)
printf("データ読み出し data=%d \n",get_data());
// test for buffer over
printf("*** buffer over test ****\n");
// write
for(int i=0;i<BUFFSIZE+5;i++) {
data=i;
printf("試行=%d bufferにデータを書き込み widx=%d ridx=%d data=%d ",i,widx,ridx,data);
if (put_data(i)==-1)
printf("BUFFER FULL\n");
else
printf("成功\n");
}
// read
for(int i=0;i<BUFFSIZE+5;i++) {
printf("試行=%d buffer から data を取得 widx=%d ridx=%d ",i,widx,ridx);
data=get_data();
if (data==-1)
printf("BUFFER EMPTY\n");
else
printf("成功 取得データ data=%d\n",data);
}
}
int main() {
test();
}
実行結果
$ ./ringbuff
*** test for normal use ****
データ書き込み data=0
データ書き込み data=1
データ書き込み data=2
データ書き込み data=3
データ書き込み data=4
データ書き込み data=5
データ書き込み data=6
データ書き込み data=7
データ書き込み data=8
データ書き込み data=9
widx=10 ridx=0
データ読み出し data=0
データ読み出し data=1
データ読み出し data=2
データ読み出し data=3
データ読み出し data=4
データ読み出し data=5
データ読み出し data=6
データ読み出し data=7
データ読み出し data=8
データ読み出し data=9
*** buffer over test ****
試行=0 bufferにデータを書き込み widx=10 ridx=10 data=0 成功
試行=1 bufferにデータを書き込み widx=11 ridx=10 data=1 成功
試行=2 bufferにデータを書き込み widx=12 ridx=10 data=2 成功
試行=3 bufferにデータを書き込み widx=13 ridx=10 data=3 成功
試行=4 bufferにデータを書き込み widx=14 ridx=10 data=4 成功
試行=5 bufferにデータを書き込み widx=15 ridx=10 data=5 成功
試行=6 bufferにデータを書き込み widx=16 ridx=10 data=6 成功
試行=7 bufferにデータを書き込み widx=17 ridx=10 data=7 成功
試行=8 bufferにデータを書き込み widx=18 ridx=10 data=8 成功
試行=9 bufferにデータを書き込み widx=19 ridx=10 data=9 成功
試行=10 bufferにデータを書き込み widx=0 ridx=10 data=10 成功
試行=11 bufferにデータを書き込み widx=1 ridx=10 data=11 成功
試行=12 bufferにデータを書き込み widx=2 ridx=10 data=12 成功
試行=13 bufferにデータを書き込み widx=3 ridx=10 data=13 成功
試行=14 bufferにデータを書き込み widx=4 ridx=10 data=14 成功
試行=15 bufferにデータを書き込み widx=5 ridx=10 data=15 成功
試行=16 bufferにデータを書き込み widx=6 ridx=10 data=16 成功
試行=17 bufferにデータを書き込み widx=7 ridx=10 data=17 成功
試行=18 bufferにデータを書き込み widx=8 ridx=10 data=18 成功
試行=19 bufferにデータを書き込み widx=9 ridx=10 data=19 成功
試行=20 bufferにデータを書き込み widx=10 ridx=10 data=20 BUFFER FULL
試行=21 bufferにデータを書き込み widx=10 ridx=10 data=21 BUFFER FULL
試行=22 bufferにデータを書き込み widx=10 ridx=10 data=22 BUFFER FULL
試行=23 bufferにデータを書き込み widx=10 ridx=10 data=23 BUFFER FULL
試行=24 bufferにデータを書き込み widx=10 ridx=10 data=24 BUFFER FULL
試行=0 buffer から data を取得 widx=10 ridx=10 成功 取得データ data=0
試行=1 buffer から data を取得 widx=10 ridx=11 成功 取得データ data=1
試行=2 buffer から data を取得 widx=10 ridx=12 成功 取得データ data=2
試行=3 buffer から data を取得 widx=10 ridx=13 成功 取得データ data=3
試行=4 buffer から data を取得 widx=10 ridx=14 成功 取得データ data=4
試行=5 buffer から data を取得 widx=10 ridx=15 成功 取得データ data=5
試行=6 buffer から data を取得 widx=10 ridx=16 成功 取得データ data=6
試行=7 buffer から data を取得 widx=10 ridx=17 成功 取得データ data=7
試行=8 buffer から data を取得 widx=10 ridx=18 成功 取得データ data=8
試行=9 buffer から data を取得 widx=10 ridx=19 成功 取得データ data=9
試行=10 buffer から data を取得 widx=10 ridx=0 成功 取得データ data=10
試行=11 buffer から data を取得 widx=10 ridx=1 成功 取得データ data=11
試行=12 buffer から data を取得 widx=10 ridx=2 成功 取得データ data=12
試行=13 buffer から data を取得 widx=10 ridx=3 成功 取得データ data=13
試行=14 buffer から data を取得 widx=10 ridx=4 成功 取得データ data=14
試行=15 buffer から data を取得 widx=10 ridx=5 成功 取得データ data=15
試行=16 buffer から data を取得 widx=10 ridx=6 成功 取得データ data=16
試行=17 buffer から data を取得 widx=10 ridx=7 成功 取得データ data=17
試行=18 buffer から data を取得 widx=10 ridx=8 成功 取得データ data=18
試行=19 buffer から data を取得 widx=10 ridx=9 成功 取得データ data=19
試行=20 buffer から data を取得 widx=10 ridx=10 BUFFER EMPTY
試行=21 buffer から data を取得 widx=10 ridx=10 BUFFER EMPTY
試行=22 buffer から data を取得 widx=10 ridx=10 BUFFER EMPTY
試行=23 buffer から data を取得 widx=10 ridx=10 BUFFER EMPTY
試行=24 buffer から data を取得 widx=10 ridx=10 BUFFER EMPTY