2013-08-02 191 views
1

我試圖將一個浮點數值的二維數組傳遞給Unity中的C++插件。從C#傳遞二維數組到C++

在C++方面我有:

void process_values(float** tab); 

在C#身邊,我已經有了一個浮[,]我不知道如何將它傳遞給我的C++插件。

我該怎麼做?

+0

它是否必須是一個二維數組?或者你可以將它內聯爲一個單一的數組(即每一行都遵循先前的內存)?傳遞一個數組會更容易。 –

+0

如果不能修改C++插件...它已經被其他人完成 – kakou

+0

它將如何知道2d數組的列大小? –

回答

0

將數據從CLR複製到本地代碼使用Marshall類。

具體

public static void Copy(
    float[] source, 
    int startIndex, 
    IntPtr destination, 
    int length 
) 

在2D情況下,你必須計算自己後續行的地址。 對於每一行,只需添加到float time lenght行的目標指針大小即可。

public void process(float[][] input) 
{ 
    unsafe 
    { 
     // If I know how many sub-arrays I have I can just fix them like this... but I need to handle n-many arrays 
     fixed (float* inp0 = input[0], inp1 = input[1]) 
     { 
      // Create the pointer array and put the pointers to input[0] and input[1] into it 
      float*[] inputArray = new float*[2]; 
      inputArray[0] = inp0; 
      inputArray[1] = inp1; 
      fixed(float** inputPtr = inputArray) 
      { 
       // C function signature is someFuction(float** input, int numberOfChannels, int length) 
       functionDelegate(inputPtr, 2, input[0].length); 
      } 
     } 
    } 
} 

實施例c#:

[DllImport("Win32Project1.dll", EntryPoint = "[email protected]@[email protected]", CallingConvention = CallingConvention.Cdecl)] 
     static extern void Save(IntPtr arr); 
static void Main(string[] args) 
     { 

      float[][] testA = new float[][] { new float[] { 1.0f, 2.0f }, new float[] { 3.0f, 4.0f } }; 

       IntPtr initArray = Marshal.AllocHGlobal(8); 
       IntPtr arrayAlloc = Marshal.AllocHGlobal(sizeof(float)*4); 

       Marshal.WriteInt32(initArray, arrayAlloc.ToInt32()); 
       Marshal.WriteInt32(initArray+4, arrayAlloc.ToInt32() + 2 * sizeof(float)); 
       Marshal.Copy(testA[0], 0, arrayAlloc, 2); 
       Marshal.Copy(testA[1], 0, arrayAlloc + 2*sizeof(float), 2); 

       Save(initArray); // C func call 

       Marshal.FreeHGlobal(arrayAlloc); 
       Marshal.FreeHGlobal(initArray); 

       Console.ReadLine(); 

     } 
+0

那麼,我最終得到的變量的國王,IntPtr的數組? – kakou

+0

intptr只是您要複製數據的內存地址。在我的選擇中,你將不得不爲C++中的浮點數組分配內存。然後你可以用元帥複製數據。 – stepandohnal

+0

或者,您可以使用不安全的代碼。 fixed(float ** inputPtr = inputArray) {C} functionn(float **) function(inputPtr); } – stepandohnal