C# 从C到C++传递二维数组 我试图把2D浮点数组传递给我的C++插件,在Unity中。< /P> 在C++方面,我有: void process_values(float** tab); 在C端,我得到了一个浮点[],我不知道如何把它传递给我的C++插件。
如何才能做到这一点?要将数据从CLR复制到本机代码,请使用Marshall类 具体地C# 从C到C++传递二维数组 我试图把2D浮点数组传递给我的C++插件,在Unity中。< /P> 在C++方面,我有: void process_values(float** tab); 在C端,我得到了一个浮点[],我不知道如何把它传递给我的C++插件。,c#,c++,plugins,unity3d,C#,C++,Plugins,Unity3d,如何才能做到这一点?要将数据从CLR复制到本机代码,请使用Marshall类 具体地 public static void Copy( float[] source, int startIndex, IntPtr destination, int length ) 在2D情况下,您必须自己计算后续行的地址。 对于每一行,只需将浮点乘以行的长度添加到目标指针大小 public void process(float[][] input) { unsafe
public static void Copy(
float[] source,
int startIndex,
IntPtr destination,
int length
)
在2D情况下,您必须自己计算后续行的地址。
对于每一行,只需将浮点乘以行的长度添加到目标指针大小
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 = "?Save@@YAXPAPAM@Z", 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();
}
它必须是二维阵列吗?或者可以将其内联为单个数组,即每一行都在内存中的前一行之后?如果不能修改C++插件,传递单个数组就容易多了。这是别人已经做过的事情。它怎么知道2d数组的列大小呢?我在它之前调用一个函数进行初始化,然后给出数组的大小。最后我得到了什么样的变量,IntPtr的数组?IntPtr只是你想要复制数据的内存地址。在我的选择中,您必须为C++中的浮点数组分配内存。然后,您可以使用封送处理复制数据。或者,您可以使用不安全代码。fixedfloat**inputPtr=inputArray{//C functionnfloat**functioninputPtr;}@stepandohnal:我也对这个感兴趣。你能提供一个包含C和C++代码的工作示例吗?工作EX可以从这里下载[Link ]