1

我有一个私人会员

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,因为我认为这是最快的方法。

谢谢!

4

3 回答 3

4

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

&m_data_content_joinfeatures[iByteStartPos]

此外,该名称iByteStartPos似乎暗示了向量中的字节偏移量。您编写的代码(一旦固定为 include &)将从向量中的iByteStartPos 双精度开始复制。如果你真的想要一个字节偏移量,你需要将数据开始转换为const char *并使用指针算法计算地址:

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

但是,一旦您的代码开始看起来像这样,重新考虑您的策略并放弃memcpy基于字节的索引,将它们替换为更安全的高级 API,例如std::copy.

于 2013-09-15T12:17:02.920 回答
1

如果您在 处进行循环memcpy,您将看到它需要一个指针作为第二个参数,并且您给它一个double.

就像是:

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

应该解决这个错误。

但是你为什么不使用std::copy呢?

于 2013-09-15T12:19:18.090 回答
0

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

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

甚至更短

memcpy(uJoinFeatures.Values, m_data_content_joinfeatures.data() + iByteStartPos, iByteCount);
于 2013-09-15T12:20:32.913 回答