【问题标题】:C/C++ - How can I convert Buffer.BlockCopy (C#) to C/C++C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++
【发布时间】:2014-02-18 21:32:00
【问题描述】:

我在C#中有如下函数:

public Matrix<float> ConcatDescriptors(IList<Matrix<float>> descriptors)
{
    int cols = descriptors[0].Cols;
    int rows = descriptors.Sum(a => a.Rows);

    float[,] concatedDescs = new float[rows, cols];

    int offset = 0;

    foreach (var descriptor in descriptors)
    {
        // append new descriptors
        Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);
        offset += sizeof(float) * descriptor.ManagedArray.Length;
    }

    return new Matrix<float>(concatedDescs);
}

我正在尝试将其翻译为C 或C++。我认为这很简单,但是,我被卡住了:

Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);

如何在C 或C++ 中重新创建同一行代码?

【问题讨论】:

    标签: c# c++ c


    【解决方案1】:

    在 C 中,等价于 memcpy。

    在 C++ 中你仍然可以使用memcpy,还有std::copy。

    请注意,C 和 C++ 允许指针(或迭代器)进入数组的中间,因此虽然 C# 将句柄传递给整个数组和起始索引,但在 C 和 C++ 中,您需要进行指针运算以找到调用函数之前的开始。

    还要注意字节数与对象数。 Buffer.BlockCopy 测量起始索引和项目数(以字节为单位)。 memcpy 也以字节为单位测量项目数。 std::copy 在元素中测量。并且 C 和 C++ 指针算术对元素的数量进行操作。如果您首先将指针转换为char*,那么元素和字节将变得相同。 (C 和 C++ char 正好是一个字节,不像 C# char 更像 C++ wchar_t)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2013-09-12
      • 1970-01-01
      相关资源
      最近更新 更多