C中的循环缓冲区

时间:2015-04-10 02:14:08

标签: c

我试图在C中制作一种循环缓冲区。这就是我现在所拥有的。

#include <stdio.h>
#define ORDER 3
#define LENGTH 7

short input[LENGTH] = {1,2,3,4,5,6,7};
short buff[ORDER] = {0,0,0};
short pos = 0;

void filter(short input, short *buff, short *pos) {
    short p = *pos;       
    if (p==ORDER) {
        p=0;
    }
    p++; 
   *(buff+p) = input;
    printf("%d %d %d (%d)\n",*(buff+p),*(buff+p-1),*(buff+p-2),p);      
    *pos = p;    
}

void main() {
    short i;
    for (i=0;i<LENGTH;i++) {
        filter(input[i],buff,&pos);
    }
}

输出:

1 0 0 (1)
2 1 0 (2)
3 2 1 (3)
4 0 3 (1)
5 4 0 (2)
6 5 4 (3)
7 0 3 (1)

但是,我试图让它输出:

1 0 0 (1)
2 1 0 (2)
3 2 1 (3)
4 3 2 (1)
5 4 3 (2)
6 5 4 (3)
7 6 5 (1)

基本上每次都会将数字转换一次。我很确定我已经接近但我似乎无法实现这一目标。

4 个答案:

答案 0 :(得分:0)

你的事情很复杂。尝试使用模运算符而不是杂耍指针。

short pos = 0;
short buff[ORDER];

void filter(short input) {
    buff[pos] = input;
    short second = (pos - 1) % ORDER;
    short third = (pos - 2) % ORDER;
    printf("%d %d %d (%d)\n", buff[pos], buff[second], buff[third], p);
    pos = (pos + 1) % ORDER;
}

答案 1 :(得分:0)

void filter(short input, short *buff, short *pos) {
    short p = *pos;       
    if (p==ORDER) {
        p=0;
    }
   *(buff+p) = input;
    printf("%hd %hd %hd (%hd)\n", buff[p],buff[p-1<0 ? p-1+ORDER : p-1],buff[p-2<0 ? p-2+ORDER : p-2], p+1);
    //printf("%hd %hd %hd (%hd)\n",buff[p],buff[(p-1+ORDER)%ORDER],buff[(p-2+ORDER)%ORDER], p+1);

    *pos = ++p;    
}

答案 2 :(得分:0)

这可以简化为:

void filter(short input, short *buff, short *pos) {
    buf[*pos] = input;
    printf("%d %d %d (%d)\n",buff[*pos],buff[(*pos+2)%ORDER],buff[(*pos+1)%ORDER],*pos);
    (++(*pos)) %= ORDER;
}

答案 3 :(得分:0)

我只是传递过滤指向输入的指针和要从

开始的索引
void filter(short * input, short* pos){
    int i;
    for(i = *pos;i<ORDER;i--){
        printf("%d ",input[i] % ORDER);
    }
    printf("(%d) \n",*pos);
    *pos = (*pos + 1) % ORDER;
}

并将其称为

filter(input,&pos);

使用循环可以在任何点更改顺序值并打印任何值范围。