gpt4 book ai didi

c# - 将二维数组从 C# 传递到 C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:38 26 4
gpt4 key购买 nike

我正在尝试将浮点值的二维数组传递到我在 Unity 中的 C++ 插件。

在 C++ 方面,我有:

 void process_values(float** tab);

在 C# 方面,我有一个 float[,],但我不知道如何将它传递给我的 C++ 插件。

我该怎么做?

最佳答案

要将数据从 CLR 复制到 native 代码,请使用 Marshall 类。

特别是

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

在二维情况下,您必须自己计算后续行的地址。对于每一行,只需将 float 的目标指针大小与行的长度相加即可。

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# - 将二维数组从 C# 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18018509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com