C / C ++ - Как я могу конвертировать Buffer.BlockCopy (C #) в C / C ++

0

У меня есть следующая функция в 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++?

Теги:

1 ответ

2

В 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню