2017-05-14 5 views
0

Je souhaite utiliser la mémoire tampon circulaire Boost pour stocker les tableaux produits par une API matérielle. L'API prend l'adresse de l'emplacement de mémoire et pousse le tableau en conséquence. J'ai donc les suivantes:Accélération de l'accès au pointeur de la mémoire tampon circulaire (C++)

typedef unsigned char API_data [10]; 

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

Mais je ne peux pas passer le pointeur it à l'API parce que:

aucune fonction de conversion appropriée de « 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 existe.

L'API attend un pointeur de type LPVOID mais pointeur it est de type différent.

+0

'est il s' aucune sorte d'un pointeur. –

+0

Vous pouvez probablement obtenir le début de la mémoire tampon avec '& * it'. Cependant, même si cela se compilera probablement, je ne m'attends pas à ce qu'il fonctionne parce qu'un tampon circulaire n'est pas seulement un tampon, il a aussi un index de début et de fin. Et ces index qui boostent pour vous doivent également être mis à jour correctement par le matériel pour atteindre ce que vous voulez. – Eelke

+0

Merci les gars pour vos contributions! J'ai supposé que 'it' est un pointeur car l'exemple de la documentation du buffer circulaire boost déréférencie' it' pour obtenir la valeur stockée à l'emplacement. Je ne suis pas suffisamment expérimenté pour trouver la documentation tampon circulaire boost autre chose que de la confusion. – HypeInst

Répondre

0

API de tampon circulaire est similaire à ::std::vector API. Mais il ya un hic. Tout d'abord, les éléments stockés dans un tampon circulaire doivent pouvoir être copiés afin que vous ne puissiez pas y stocker des tableaux bruts. Deuxièmement, vous fournissez la capacité du conteneur dans le constructeur, pas la taille du conteneur initial, donc avant d'essayer de passer un pointeur sur un élément stocké, vous devez vous assurer qu'il est là. Pousser dans un tampon circulaire peut laisser tomber les éléments les plus anciens si le tampon est plein contrairement à std::vector qui va toujours croître. Ensuite, vous pouvez obtenir une référence à un élément poussé et le convertir en pointeur pour annuler.

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

Merci @VTT pour cette information. Je ne savais pas si je pouvais ou non stocker des tableaux bruts dans le tampon circulaire et envisageait également d'utiliser 'std :: vector'. Donc, je vais procéder en conséquence. Merci encore! – HypeInst