C ++:循环缓冲区的问题

时间:2017-01-20 06:40:04

标签: c++

我在使用C ++编写循环缓冲区时遇到了一些麻烦。这是我目前的代码库:

circ_buf.h:

#ifndef __CIRC_BUF_H__
#define __CIRC_BUF_H__


#define MAX_DATA (25)  // Arbitrary size limit

// The Circular Buffer itself
struct circ_buf {
    int s;               // Index of oldest reading
    int e;               // Index of most recent reading
    int data[MAX_DATA];  // The data
};

/*** Function Declarations ***/
void empty(circ_buf*);
bool is_empty(circ_buf*);
bool is_full(circ_buf*);
void read(circ_buf*, int);
int overwrite(circ_buf*);


#endif  // __CIRC_BUF_H__

circ_buf.cpp:

#include "circ_buf.h"


/*** Function Definitions ***/

// Empty the buffer
void empty(circ_buf* cb) {
    cb->s = 0; cb->e = 0;
}

// Is the buffer empty?
bool is_empty(circ_buf* cb) {
    // By common convention, if the start index is equal to the end
    // index, our buffer is considered empty.
    return cb->s == cb->e;
}

// Is the buffer full?
bool is_full(circ_buf* cb) {
    // By common convention, if the start index is one greater than
    // the end index, our buffer is considered full.
    // REMEMBER: we still need to account for wrapping around!
    return cb->s == ((cb->e + 1) % MAX_DATA);
}

// Read data into the buffer
void read(circ_buf* cb, int k) {
    int i = cb->e;
    cb->data[i] = k;
    cb->e = (i + 1) % MAX_DATA;
}

// Overwrite data in the buffer
int overwrite(circ_buf* cb) {
    int i = cb->s;
    int k = cb->data[i];
    cb->s = (i + 1) % MAX_DATA;
}

circ_buf_test.cpp:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include "circ_buf.h"


int main(int argc, char** argv) {
    // Our data source
    std::string file = "million_numbers.txt";
    std::fstream in(file, std::ios_base::in);

    // The buffer
    circ_buf buffer = { .s = 0, .e = 0, .data = {} };

    for (int i = 0; i < MAX_DATA; ++i) {
        int k = 0; in >> k;  // Get next int from in
        read(&buffer, k);
    }

    for (int i = 0; i < MAX_DATA; ++i)
        std::cout << overwrite(&buffer) << std::endl;
}

我遇到的主要问题是让缓冲区将整数写入其数组。当我编译并运行主程序(circ_buf_test)时,它只打印相同的数字25次,而不是我期望打印的数字(数字1到25 - “million_numbers.txt”实际上只是数字1到1000000) 。这个数字是2292656,如果这可能很重要。

有没有人知道这里可能出现的问题?

1 个答案:

答案 0 :(得分:1)

你的函数overwrite(circ_buf* cb)什么都不返回(它的正文中没有return)。因此,打印值的代码可以打印任何内容(请参阅“未定义的行为”):

 for (int i = 0; i < MAX_DATA; ++i)
        std::cout << overwrite(&buffer) << std::endl;

我希望你能在编译日志中找到这个“主要问题”的原因(参见以“警告”开头的行)。你可以这样修理它:

int overwrite(circ_buf* cb) {
    int i = cb->s;
    int k = cb->data[i];
    cb->s = (i + 1) % MAX_DATA;
    return k;
}