【问题标题】:C++ memcpy: double incompatible with const voidC ++ memcpy:与const void双重不兼容
【发布时间】:2013-09-15 12:14:44
【问题描述】:

我有一个私人会员

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

谢谢!

【问题讨论】:

  • 听你的编译器:double 不能转换为void*。您的iByteStartPos 也有错误命名或错误。
  • 您有什么理由不使用std::copy()
  • 没有特别的原因。我只是没有经验。
  • @tmighty 这是一个学习它的好机会。不要在 C++ 中使用 C 工具,除非你知道必须这样做。

标签: c++ vector struct memcpy


【解决方案1】:

memcpy 的第二个参数必须是地址:

&m_data_content_joinfeatures[iByteStartPos]

另外,iByteStartPos 这个名字似乎暗示了向量中的 byte 偏移量。您编写的代码(一旦固定为包含&amp;)将从向量中的iByteStartPos double 开始复制。如果你真的想要一个字节偏移量,你需要将数据开始转换为const char *并用指针算法计算地址:

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

但是一旦您的代码开始看起来像这样,最好重新考虑您的策略并放弃memcpy 和基于字节的索引,用更安全的高级API(例如std::copy)取而代之。

【讨论】:

    【解决方案2】:

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

    类似:

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

    应该解决这个错误。

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

    【讨论】:

      【解决方案3】:

      有了С++11,你可以做到

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

      甚至更短

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

      【讨论】:

      • 这改变了原来的问题。复制的数据不位于序列的开头。
      • 是的,你是对的,我错过了问题中的索引。编辑了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多