2014-02-18 35 views
0

我在C#以下功能:C/C++ - 我如何轉換Buffer.CopyBlock(C#),以C/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); 
} 

,我試圖將其翻譯爲CC++。我認爲這是相當簡單的,但是,我堅持上線:

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

我怎樣才能重新的代碼CC++這同一行?

回答

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