2011-12-09 12 views
1

私は、リングサイズが5の単純なリングバッファをコーディングして、タイプAの値を格納しました。 これで、タイプBの値(5値)を格納するようにこのバッファを拡張する必要があります。Cの2Dリングバッファ

概要を読むために、私は読み取りインデックスと書き込みインデックスの変数をグローバルvolatileとして定義し、リングバッファの読み書きに2つの関数を定義しました。

私はしなければならない:ring data = int read_ring_data()write_ring_data(int pass_new_data)

揮発性のグローバル変数は、読み取りの位置を制御し、書き込みができます。

私の質問は、これらの読み書き機能を再調整して2Dバッファに拡張する方法がありますか?どのように実装するのですか?

+5

「2D」とはどういう意味ですか?緯度と経度のドーナツ、または2つの積み重なったハラホープのようなもの? –

+0

もしあなたがC++を使用しているのであれば、あなたのリングバッファをテンプレートクラスにすることができるので、 'ringBuffer >'のようなものを2Dバッファにすることができます...しかし、Cがテンプレートに相当します。私もあなたが本当に多次元のリングバッファを望んでいるとは思わない...あなたは何を解決しようとしているのですか? – thecoshman

+2

"揮発性グローバル変数[...]":これは悪いデザインを示しています...アプリケーションでバッファのインスタンスを2つ使用するにはどうすればいいですか?バッファとインデックスの両方を含む構造体を作成し、構造体を最初のパラメータとするいくつかの関数を定義する必要があります。 –

答えて

1

Cでオブジェクト指向のスタイルでコードを記述することはできますが、単にstructをクラスとして使用するだけで、 'メソッド'はクラスへのポインタを取る関数に過ぎません。次のように私はあなたがコースのリングバッファの構造体を割り当てるの世話をする必要があるだろう、一部の人々は、いくつかのマクロを使っていることを行う可能性があります

typedef struct RingBuffer { 
    int elemSize; 
    int headIndex; // index to write 
    int tailIndex; // index to read 
    int maxIndex; 
    void* buffer; 
} 
RingBuffer; 
// initialize a new ring-buffer object 
void RingBuffer_Init(RingBuffer* rb, int elemSize, int maxNum) { 
    rb->elemSize=elemSize; rb->headIndex = 0; rb->tailIndex=0; rb->buffer = malloc(elemSize*maxNum); 
    rb->maxIndex=maxNum; 
} 
void RingBuffer_Read(RingBuffer* rb, void* dstItem){ // copy into buffer, update index 
    void* src=rb->buffer + rb->tailIndex*rb->elemSize; 
    memcpy(dstItem,src,rb->elemSize); 
    rb->tailIndex++; ....//wrapround, assert etc.. 
} 
void RingBuffer_Write(RingBuffer* rb, const void * srcItem) { // copy from buffer,update indices 
}// etc.. 

... Cの汎用「リングバッファ」「クラス」を作成します彼らが 'init'(C++コンストラクタのequiv)と 'shutdown'/'release'関数の一貫した命名体系を採用している場合には、これらの関数を呼び出すことができます。可変サイズの要素を読み書きすることができます。おそらく要素サイズを各点のバッファに書き込むことができます。素早くサイズを変更したり、要素サイズを変更したりすることも可能です。

データ構造を作成するための言語サポートは、C++よりもCではより原始的ですが、単純なデータ構造を使用するために問題を再作成するとパフォーマンスが向上することがあります。また、データ構造をパラメータとして渡されたサイズの単純なメモリブロックとして扱うと、コンパイラのインライン化が少なくなる可能性があります。コンパクトコードは、内部ループの外側で使用するデフォルトメソッド(i-キャッシュコヒーレンシ)として利点があります。

'バッファーヘッダー'構造と配列データを1つの割り当てに組み合わせることができます(バッファーデータがメモリー内のヘッダー構造に従うものと仮定します)。これにより、ポインタ逆参照の量が少なくなります。

+0

ありがとう..私はこれらの行に沿って試してみましょう – user489152