C ++ memcpy:double与const void不兼容

时间:2013-09-15 12:14:44

标签: c++ vector struct memcpy

我有私人会员

vector<double>m_data_content_joinfeatures;

和结构:

struct udtJoinFeatures
{
    double Values[16];
};

我现在想将m_data_content_joinfeatures中的一些值复制到udtJoinFeatures的结构中,如下所示:

void clsMapping::FeedJoinFeaturesFromMap(udtJoinFeatures &uJoinFeatures)
{

    unsigned int iByteStartPos=1024; //where the data starts that I want to copy
    unsigned int iByteCount=128; //the number of bytes that I want to copy

    memcpy(&uJoinFeatures.Values[0], m_data_content_joinfeatures[iByteStartPos],iByteCount);
}

但编译器告诉我“double与void *的参数不兼容”。

有人可以帮忙吗?我不想使用for-next-statement复制我的值。 我想尽可能使用MemCpy,因为我认为这是最快的方式。

谢谢!

3 个答案:

答案 0 :(得分:4)

memcpy的第二个参数需要是一个地址:

&m_data_content_joinfeatures[iByteStartPos]

此外,名称iByteStartPos似乎意味着 byte 偏移到向量中。您编写的代码(一旦修复为包含&)将从向量中的iByteStartPos double 开始复制。如果你真的想要一个字节偏移,你需要将数据开始转换为const char *并用指针算法计算地址:

memcpy(&uJoinFeatures.Values[0],
       reinterpret_cast<const char*>(m_data_content_joinfeatures.data()) + iByteStartPos,
       iByteCount);

但是一旦你的代码看起来像这样,最好重新考虑你的策略并转离memcpy和基于字节的索引,用更安全的高级API替换它们,例如{{1} }。

答案 1 :(得分:1)

如果你在memcpy进行循环,你会看到它需要一个指针作为第二个参数,你给它一个double

类似的东西:

 memcpy(&uJoinFeatures.Values[0], &m_data_content_joinfeatures[iByteStartPos],iByteCount);
 //                               ^

应解决此错误。

但为什么不使用std::copy

答案 2 :(得分:0)

使用С++ 11,你可以做到

memcpy(&uJoinFeatures.Values[0], m_data_content_joinfeatures.data() + iByteStartPos, iByteCount);

甚至更短

memcpy(uJoinFeatures.Values, m_data_content_joinfeatures.data() + iByteStartPos, iByteCount);