2017-03-03 2 views
-1

J'ai une fonction qui copie un tableau de nombres entiers dans un vecteur qui fonctionne bien avec l'appel std :: copy mais quand j'ai changé std :: copy en std :: memcpy cela ne fonctionne pas correctement. Quelqu'un peut-il indiquer ce que je fais mal?Conversion std :: copy en std :: memcpy ne fonctionne pas?

void Walle_SSD1306::RadarD(uint8_t *RadarLL, uint8_t isFirstRadarLogo) 
{ 
//Following two copy statement is working correctly 
std::copy(
    RadarLL+128 
    , RadarLL + 8192 
    , buffer.begin()+128 
    ); 
std::copy(
    RadarLL+38 
    , RadarLL + 90 
    , buffer.begin()+38 
    ); 

//But when I change copy to memcpy following code is not working correctly 
std::memcpy(
    (buffer.begin()+128) , (RadarLL+128), (8192 - 128)*sizeof(uint8_t) 
    ); 
std::memcpy(
    (buffer.begin()+38), (RadarLL+38), (52*sizeof(uint8_t)) 
    ); 

//where buffer is... 
std::vector<uint8_t> buffer; 
+0

Une telle expression buffer.begin() + 128 utilisé dans le memcpy est invalide. Vous devriez utiliser au moins & bffer [128] ou buffer.data() + 128 –

+0

Quand vous dites "ne fonctionne pas" nous n'avons aucune idée de ce que cela signifie. Est-ce qu'il compile même? –

+0

Le code est compilé mais le tampon n'obtient pas la valeur correcte de RadarLL. Pouvez-vous signaler toute erreur que je fais? – user5572904

Répondre

1

std :: copie peut travailler avec itérateurs et prend en charge les tampons se chevauchent Memcpy fonctionne uniquement avec des pointeurs

0

En utilisant l'expression buffer.begin()+128 dans le memcpy est invalide car en général cette expression donne un itérateur.

Vous devez utiliser des pointeurs. Par exemple

std::memcpy(
    (buffer.data()+128) , (RadarLL+128), (8192 - 128)*sizeof(uint8_t) 
    ); 

ou

std::memcpy(
    &buffer[128] , (RadarLL+128), (8192 - 128)*sizeof(uint8_t) 
    );