2014-03-05 95 views
0

假設我有一個緩衝:什麼是在環形緩衝區中向後循環的好方法?

static const int BUFFER_SIZE = 3; // for example 
int buffer[BUFFER_SIZE]; 

,我想通過它

int index = 0; 
for(;;) 
{ 
    buffer[index] = ...; 
    index = (index + 1) % BUFFER_SIZE; // index = 0, 1, 2, 0, 1, 2, 0, 1, 2, ... 
} 

但是,如果我通過緩衝要循環向後會發生什麼循環? 如:0,2,1,0,2,1,...

現在林這樣做:

index = (index <= 0) ? BUFFER_SIZE - 1 : index - 1; 

有沒有做這些操作的更好的辦法?

回答

1

你可以試試這個:

for (int *p = buffer;;) { 
    if (p == buffer) p = buffer + BUFFER_SIZE;   

    // these next lines could be combined using the pre-decrement operator 
    // at expense of some readability 
    p--; 
    int index = int(p - buffer); // in case you need the zero-based index 
    *p = ...; 
} 

或本:

for (int *p = buffer + BUFFER_SIZE - 1;;p--) { 
    int index = int(p - buffer); // in case you need the zero-based index 
    *p = ...; 
    if (p == buffer) p = buffer + BUFFER_SIZE;   
} 
2

在你的第一個決定的精神,我們可以這樣寫:

int idx = 0; 
int i=0; 
for (;;) { 
     buffer[idx] = ...; 
     i = (i+1) % BUFFER_SIZE; 
     idx = (BUFFER_SIZE - i) % BUFFER_SIZE; 
}