2011-12-09 47 views
1

我編寫了一個簡單的環形緩衝區,環形大小爲5,用於存儲A型值。 現在我必須擴展此緩衝區以存儲B型值(也有5個值)。C環境中的二維環形緩衝區

爲了給出一個概述,我已經將讀取索引和寫入索引的變量定義爲全局易失性和兩個讀寫環形緩衝區的函數。

我唯一要做的:ring data = int read_ring_data()write_ring_data(int pass_new_data)

揮發性全局變量有助於控制讀取的位置和書寫。

我的問題是,有沒有辦法重新使用這些讀寫函數來將其擴展到2D緩衝區?我如何實現它?

+5

「2D」是什麼意思?像一個有經緯度的甜甜圈,或者像兩個疊加的hulahoops? –

+0

好吧...如果你在哪裏使用C++,你可以讓你的環緩衝區模板類,從而做一些像'ringBuffer >'這將是一個2D緩衝區...但我不知道C有一個相當於模板。我也不認爲你真的想要一個多維環緩衝區......你想要解決什麼問題? – thecoshman

+2

「易變的全局變量[...]」:這顯示了一個糟糕的設計......如何在應用程序中使用2個緩衝區實例?你應該創建一個包含緩衝區和索引的結構體,並且定義了一些將結構體作爲第一個參數的函數。 –

回答

1

您仍然可以在C中使用面向對象的風格進行編碼,只需使用struct作爲類,'methods'只是將指針指向類的函數。我想如下C語言創建一個通用的「環形緩衝區」「類」 ..

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

你必須照顧分配過程中的RingBuffer結構的,有些人可能會做一些宏觀如果他們對'init'(等同於C++構造函數)和'shutdown'/'release'函數採用一致的命名方案

當然有很多排列方式..將一個環形緩衝區您可以讀取/寫入可變大小的元素,也許可以在每個點處將元素大小寫入緩衝區。當然也可以隨時調整大小,甚至改變元素大小。

儘管創建數據結構的語言支持在C中比在C++中更原始,但有時候重新使用問題來使用簡單的數據結構可能會帶來性能上的好處。將數據結構視爲簡單的內存塊,並將大小作爲參數傳遞可能會導致編譯器內聯減少:緊湊型代碼可能具有作爲內部循環外部使用的默認方法(i-cache一致性)的優點。

將'Buffer Header'結構和陣列數據組合成一個分配(假設緩衝區數據跟隨內存中的頭部結構),這將減少指針去引用的數量。

+0

好的,謝謝..讓我沿着這些方向嘗試 – user489152