2016-02-24 13 views
2

我需要使用庫提供的一些低級別C函數來包裝它們並提供「更高級別的層」。在這種情況下,我的問題是獲取包含在緩衝區中的數據,並且至少要學會如何正確地做到這一點,我想知道您認爲在C++ 03中做什麼以及在C + +11。我正在Red Hat Linux下工作,使用GCC 4.4.7(所以不是真正的C++ 11兼容,https://gcc.gnu.org/gcc-4.4/cxx0x_status.html)。從數組轉換爲向量 - 與C庫的接口

這裏是什麼,我試圖做一個片段:

#define DATA_BLOCKS 4096 // the numbers of 16-bit words within the buffer 

std::vector<uint16_t> myClass::getData() 
{ 
    uint16_t buffer[DATA_BLOCKS]; 
    getDataBuf(fd, dma, am, buffer[]); //C-function provided by the library 

    // pushing buffer content into vector 
    std::vector <uint16_t> myData; 
    for(int i=0; i<DATA_BLOCKS; i++) 
     myData.pushback(buffer[i]); 
    return myData; 
} 

在我提供的鏈接,我無法找到,如果它繼續像在C++ 11返回一個好主意'整個'矢量。

對於一個向量,是否有一個最好的方法來填充'myData'比在循環中使用方法'pushback()'?

回答

4

你可以做到這一點,它是安全的:

std::vector<uint16_t> myClass::getData() 
{ 
    std::vector <uint16_t> myData(DATA_BLOCKS); 
    getDataBuf(fd, dma, am, myData.data()); //C-function provided by the library 
    // Old interface, before c++11 : getDataBuf(fd, dma, am, &myData[0]); 

    return myData; 
} 

,或者如果你想填定的載體:

void myClass::getData(std::vector<uint16_t> &myData) 
{ 
    myData.resize(DATA_BLOCKS); 
    getDataBuf(fd, dma, am, myData.data()); //C-function provided by the library 
    // Old interface, before c++11 : getDataBuf(fd, dma, am, &myData[0]); 
} 

Personnally,我不知道返回向量的意見(這可能會使用移動語義)或填充一個給定的矢量

EDIT

而不是使用向量,因爲您知道精確的大小,您可以使用std::array<std::uint8_t, DATA_BLOCKS>容器(C++ 11中的新增功能)。這種使用是一樣的載體在我的例子

EDIT2

矢量和陣列使用連續的存儲位置(reference for vector class),因此,如果你從第一元件地址,則可以通過遞增地址來訪問第二個。向量的唯一危險點是確保分配內存。在這兩種情況下,我設法擁有足夠的分配內存:在第一個示例中,vector是使用fill構造函數創建的,第二個是將vector調整爲相應的大小。這種方法在「有效的STL - 50種改善標準模板庫的使用的具體方法」一書[Scott Meyers]中描述。對於數組,沒有問題(條件是當然聲明數組足夠的內存)。

+0

所以,我會喜歡使用std :: array,但我的GCC版本沒有。我爲g ++提供了標誌'-std = C++ 0x',以確保使用最接近可能的C++ 11兼容(即使離它很遠)的東西。 – Paradox

+0

另一方面,如果你願意,我想對你的第一個方法做一些解釋,因爲即使你稱之爲「安全」,也不知道如何理解引用到第一種情況的數組部分O_o – Paradox

+0

只是複製/粘貼的一個愚蠢的錯誤,但在你的第二個例子中,不應該有'return') – Paradox

1

data()附帶C++ 11。在我看來,使用它會使代碼更加引人注目,而其他人雖然也是如此,但它不會被添加。

+0

之前感謝您的解釋。 – Paradox