2017-05-14 72 views
0

我想使用Boost循環緩衝區來存儲由硬件API生成的數組。 API接收內存位置的地址並相應地推送陣列。所以,我有以下幾點:Boost循環緩衝區指針訪問(C++)

typedef unsigned char API_data [10]; 

boost::circular_buffer<API_data> data(10); 
boost::circular_buffer<API_data>::iterator it = data.begin(); 

但我不能指針it傳遞給API,因爲:

沒有合適的轉換功能,從「boost::cb_details::iterator<boost::circular_buffer<API_data, std::allocator<API_data>>, boost::cb_details::nonconst_traits<boost::container::allocator_traits<std::allocator<API_data>>>>」到LPVOID存在。

該API期望類型爲LPVOID的指針,但是it指針的類型不同。

+0

'it'不是任何類型的指針。 –

+0

您可能可以通過'&* it'獲得緩衝區的開始,但儘管這很可能會進行編譯,但我不希望它能夠正常工作,因爲循環緩衝區不僅僅是一個緩衝區,它還有一個開始和結束索引。而且這些增強的索引也必須由硬件正確更新以達到您想要的效果。 – Eelke

+0

謝謝你們的投入!我認爲'it'是一個指針,因爲boost循環緩衝區文檔中的示例將引用'it'來獲取存儲在該位置的值。我沒有足夠的經驗去找到增強循環緩衝區文檔以外的任何東西,而不是混淆。 – HypeInst

回答

0

循環緩衝區API與::std::vector API類似。但是有一個問題!首先,存儲在循環緩衝區中的項目必須是可複製分配的,因此您不能在其中存儲原始數組。其次,您在構造函數中提供容器容量,而不是初始容器大小,因此在嘗試將指針傳遞給存儲的項目之前,需要確保它存在。推入循環緩衝區可能會丟棄最古老的物品,如果緩衝區已滿,不像std::vector這將永遠增長。然後你可以得到一個推送項目的引用並將其轉換爲void指針。

using API_data_buffer = ::std::array< unsigned char, 10 >; 

::boost::circular_buffer<API_data_buffer> buffers(10); // buffers is still empty! 
buffers.push_back(); 
auto & api_data_buffer{buffers.back()}; 
auto const p_void_api_data{reinterpret_cast< void * >(reinterpret_cast<::std::uintptr_t>(api_data_buffer.data()))}; 
+0

謝謝@VTT獲取此信息。我不確定是否可以將原始數組存儲在循環緩衝區中,並且正在考慮使用'std :: vector'。所以我會照着去做。再次感謝! – HypeInst