2010-09-01 56 views
16

Tôi thấy rất nhiều mẫu và cấu trúc dữ liệu phức tạp để triển khai bộ đệm tròn.Làm cách nào để mã một bộ đệm tròn số nguyên đơn giản trong C/C++?

Làm cách nào để mã một bộ đệm tròn số nguyên đơn giản cho 5 số?

Tôi đang nghĩ đến C là đơn giản nhất?

Cảm ơn.

+7

Độ phức tạp của mã tăng lên mức độ an toàn và mạnh mẽ bạn muốn. Bạn có muốn nó ngăn chặn tràn/tràn, ví dụ? –

+3

Lưu ý: bộ đệm tròn (vòng tròn) khác với hàng đợi * tròn *. –

+0

Tôi chỉ cần lưu trữ 5 giá trị cuối cùng của một số dữ liệu, vì vậy bất kỳ điều gì có thiết kế tốt hơn để thực hiện điều đó. –

Trả lời

25

Có một mảng, buffer, trong tổng số 5 số nguyên. Có chỉ mục ind thành phần tử tiếp theo. Khi bạn thêm, làm

buffer[ind] = value; 
ind = (ind + 1) % 5; 
+6

Từ tệp trải nghiệm cá nhân, bạn cần phải cẩn thận rằng ind không phải là số âm. Nếu bạn thay đổi dòng thứ hai thành "ind = (max (0, ind)% 1) + 5;", bạn không phải lo lắng về giá trị âm cho ind. –

+2

Tại sao bạn không chỉ đặt ind là uint? Điều đó sẽ giải quyết vấn đề của bạn hiệu quả hơn nếu chỉ bổ sung có liên quan – Triskeldeian

1

Nếu kích thước và kiểu dữ liệu của bộ đệm của bạn là cố định, một mảng đơn giản là tất cả các bạn cần:

int buffer[5]; 

Thêm vào đó một vài gợi ý:

int* start = &buffer[0]; 
int* end = &buffer[4]+1; 
int* input = start; 
int* output = start; 
11

Lấy một mảng, arr, chỉ mục idx và bộ đếm, num.

Để chèn foo, hãy nói arr[idx++] = foo; idx %= buffer_len; num++;.

Để đọc một mục vào foo, hãy nói foo = arr[(idx-num)%buffer_len]; num--;.

Thêm kiểm tra biên giới.

+0

Bạn không cần num và idx. – user3467349

1
int rI =0; 
int wI=0; 
#define FIFO_SIZE 3 
int checkAvail() 
{ 
int avail=0; 

if(wI<rI) 
    avail= (rI-wI); 
else 
    avail = (FIFO_SIZE-wI+rI); 
return avail; 
} 

int addFIFO(int *a, int val) 
{ 
if(checkAvail()>0) 
{ 
    a[wI]=val; 
    wI++; 
    if(wI>FIFO_SIZE) 
     wI=0; 
} 
else 
{ 
    printf("FIFO full"); 
} 
return 0; 
} 
int remFIFO(int *a) 
{ 
int val; 
if((FIFO_SIZE-checkAvail()>0)) 
{ 
    val =a[rI]; 
    rI++; 
    if(rI>FIFO_SIZE) 
     rI=0; 
} 
else 
{ 
    printf("FIFO empty"); 
} 
return 0; 
} 
int main(array<System::String ^> ^args) 
{ 
int FIFO_ARRAY[FIFO_SIZE]={}; 
addFIFO(FIFO_ARRAY,1); 
addFIFO(FIFO_ARRAY,2); 
addFIFO(FIFO_ARRAY,3); 
addFIFO(FIFO_ARRAY,4); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
} 
Các vấn đề liên quan