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つの割り当てに組み合わせることができます(バッファーデータがメモリー内のヘッダー構造に従うものと仮定します)。これにより、ポインタ逆参照の量が少なくなります。
「2D」とはどういう意味ですか?緯度と経度のドーナツ、または2つの積み重なったハラホープのようなもの? –
もしあなたがC++を使用しているのであれば、あなたのリングバッファをテンプレートクラスにすることができるので、 'ringBuffer>'のようなものを2Dバッファにすることができます...しかし、Cがテンプレートに相当します。私もあなたが本当に多次元のリングバッファを望んでいるとは思わない...あなたは何を解決しようとしているのですか? –
thecoshman
"揮発性グローバル変数[...]":これは悪いデザインを示しています...アプリケーションでバッファのインスタンスを2つ使用するにはどうすればいいですか?バッファとインデックスの両方を含む構造体を作成し、構造体を最初のパラメータとするいくつかの関数を定義する必要があります。 –