सी में व्यक्त एक बहुत ही सरल कार्यान्वयन, एक गोलाकार बफर शैली फीफो कतार लागू करता है। कतार आकार, कतार डेटा, और कतार सूचकांक (इन और आउट) युक्त संरचना बनाकर अधिक सामान्य बनाया जा सकता है, जो कतार से जोड़ने या निकालने के लिए डेटा के साथ पारित किया जाएगा। ये वही दिनचर्या तब कई कतारों को संभालने में सक्षम हो सकती हैं। यह भी ध्यान रखें कि यह किसी भी आकार की कतारों की अनुमति देता है, हालांकि यदि आप 2 की शक्तियों का उपयोग करते हैं और कोड को और कस्टमाइज़ करते हैं तो स्पीडअप का उपयोग किया जा सकता है।
/* Very simple queue
* These are FIFO queues which discard the new data when full.
*
* Queue is empty when in == out.
* If in != out, then
* - items are placed into in before incrementing in
* - items are removed from out before incrementing out
* Queue is full when in == (out-1 + QUEUE_SIZE) % QUEUE_SIZE;
*
* The queue will hold QUEUE_ELEMENTS number of items before the
* calls to QueuePut fail.
*/
/* Queue structure */
#define QUEUE_ELEMENTS 100
#define QUEUE_SIZE (QUEUE_ELEMENTS + 1)
int Queue[QUEUE_SIZE];
int QueueIn, QueueOut;
void QueueInit(void)
{
QueueIn = QueueOut = 0;
}
int QueuePut(int new)
{
if(QueueIn == ((QueueOut - 1 + QUEUE_SIZE) % QUEUE_SIZE))
{
return -1; /* Queue Full*/
}
Queue[QueueIn] = new;
QueueIn = (QueueIn + 1) % QUEUE_SIZE;
return 0; // No errors
}
int QueueGet(int *old)
{
if(QueueIn == QueueOut)
{
return -1; /* Queue Empty - nothing to get*/
}
*old = Queue[QueueOut];
QueueOut = (QueueOut + 1) % QUEUE_SIZE;
return 0; // No errors
}
स्रोत
2008-10-18 21:12:55
मुझे सही अगर मैं गलत हूँ, लेकिन यह आप केवल 99 प्रविष्टियों को स्टोर करने की अनुमति नहीं है? अभिव्यक्ति (== (आउट -1 + SIZE)% SIZE में) कहती है कि अगर पहले एक है। लेकिन अभी तक लिखा नहीं गया है, इसलिए 100 वां स्थान कभी लिखा नहीं गया है। –
@ जोनाथन - यह सही है, और यह विशेषज्ञों के लिए पर्याप्त है, लेकिन इसका लक्ष्य शुरुआती लोगों के लिए है, इसलिए मैंने कोड को और अधिक स्पष्ट बनाने के लिए संशोधित किया है। नोट के लिए धन्यवाद! –
@AdamDavis। यह कोड सही नहीं है। यदि आप बफर देखते हैं, न केवल यह "छेद" छोड़ देता है, तो छेद बफर के माध्यम से पिछड़ा "क्रॉल" करता है। मैंने यहां पोस्ट किए गए कोड के लिए प्रेरणा के रूप में काम किया है, इसलिए मैं इस कोड को उस अंत में पोस्ट करने के लिए धन्यवाद देना चाहता हूं। http://stackoverflow.com/questions/827691/how-do-you-implement-a-circular-buffer-in-c/13888143#13888143 – RocketRoy