我有私人会员
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,因为我认为这是最快的方式。
谢谢!
答案 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);