0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-01-31

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

コード

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
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?