リングバッファのカウンタオーバーフロー対策
リングバッファ
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%90%E3%83%83%E3%83%95%E3%82%A1
限られた容量の中で効率よくメモリを使うためにリングバッファを使う方は多いかと思います
当サイトの通信プログラムでも使用しています
で、リングバッファの参照するカウンターについてです
当然のことならがカウンタを加算し続ければいずれオーバーフローになります
そうならないためにもどこかで初期化する必要があるのですが
通信プログラムではこんな感じで対処しました
以下、サンプル
#define BUFF_MAX 32
int g_nRingBuf[ BUFF_MAX ];
int g_nRingRead;
int g_nRingWrite;
{
g_nRingRead = g_nRingWrite = 0;
for( int i = 0; i < 1000; i++ )
{
int nRead = g_nRingRead % BUFF_MAX;
int nWrite = g_nRingWrite % BUFF_MAX;
if( g_nRingRead < g_nRingWrite )
{
int n = g_nRingBuf[ nRead ];
g_nRingRead++;
}
g_nRingBuf[ nWrite ] = i;
g_nRingWrite++;
// 通信プログラムで使用しているカウンタオーバーフロー対策
if( ( g_nRingRead > BUFF_MAX ) && ( g_nRingWrite > BUFF_MAX ) )
{
g_nRingRead -= BUFF_MAX;
g_nRingWrite -= BUFF_MAX;
}
}
}
読み書き2つのカウンタを用意しています
双方ともバッファの数を超えたらバッファ数分引いているやり方です
このやり方なんですがどうも美しくない気がしましてね
なんかこうエレガントな方法をどなたかご存知ないでしょうか
以下、関連書籍