リングバッファサンプルプログラム in C


リングバッファのサンプルプログラムです。

# コード

```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
```