2017-01-20 63 views
-2

我在使用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

'__CIRC_BUF_H__'是爲實現保留的標識符,因爲它包含連續的下劃線。你應該想出另一名頭球后衛。 'CIRC_BUF_H_'可以。 – user2079303

+0

@ user2079303會做。感謝您的建議。 – MrM21632

回答

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; 
} 
+0

哇,我覺得失望的愚蠢。謝謝。 – MrM21632