У меня есть следующая функция в 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 эквивалент будет memcpy
.
В C++ вы все равно можете использовать memcpy
, а также std::copy
.
Обратите внимание, что C и C++ позволяют указателям (или итераторам) находиться в середине массива, поэтому, когда С# передает дескриптор всему массиву и начальному индексу, в C и C++ вы должны выполнить арифметику указателя, чтобы найдите начало перед вызовом функции.
Также будьте осторожны с количеством байтов и количеством объектов. Buffer.BlockCopy
измеряет начальный индекс и количество элементов в байтах. memcpy
измеряет количество элементов в байтах. std::copy
меры в элементах. А арифметика указателей C и C++ работает с количеством элементов. Если вы сначала char*
указатель на char*
тогда элементы и байты станут одинаковыми. (C и C++ char
- это точно один байт, в отличие от char
С#, который больше похож на C++ wchar_t
)