2017-05-14 11 views
0

부스트 순환 버퍼를 사용하여 하드웨어 API에서 생성 된 배열을 저장하고 싶습니다. API는 메모리 위치의 주소를 가져 와서 그에 따라 배열을 푸시합니다.부스트 순환 버퍼 포인터 액세스 (C++)

typedef unsigned char API_data [10]; 

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

을하지만 때문에 나는 API 포인터 it을 전달할 수 없습니다 : 그래서 다음이 LPVOID에 "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>>>>"에서

더 적합한 변환 기능이 존재한다.

이 API 유형 LPVOID하지만 it 포인터의 포인터를 기대하고는 다른 유형이다.

+0

'it' 포인터의 어떤 종류가 아닙니다. –

+0

아마도'& * it'를 사용하여 버퍼의 시작을 얻을 수 있습니다. 그러나 순환 버퍼가 버퍼 일뿐만 아니라 시작 및 끝 인덱스가 있기 때문에 컴파일 할 가능성이 가장 높습니다. 그리고 부스트를 유지하는 이러한 인덱스는 하드웨어가 올바르게 업데이트하여 원하는 것을 얻을 수 있어야합니다. – Eelke

+0

의견을 보내 주셔서 감사합니다. 부스트 순환 버퍼 문서의 예제는 그 위치에 저장된 값을 얻기 위해'it'를 역 참조하기 때문에'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