Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#包装到本机c++;代码,包装作为数组指针的参数 我在C++的非托管代码中有以下简单的DLL;_C#_C++_Pointers_Wrapper_Jagged Arrays - Fatal编程技术网

c#包装到本机c++;代码,包装作为数组指针的参数 我在C++的非托管代码中有以下简单的DLL;

c#包装到本机c++;代码,包装作为数组指针的参数 我在C++的非托管代码中有以下简单的DLL;,c#,c++,pointers,wrapper,jagged-arrays,C#,C++,Pointers,Wrapper,Jagged Arrays,extern "C" __declspec(dllexport) void ArrayMultiplier(float (*pointerArray)[3], int scalar, int length); void ArrayMultiplier(float (*pointerArray)[3], int scalar, int length) { for (int i = 0 ; i < length ; length++) { for (int

extern "C" __declspec(dllexport) void ArrayMultiplier(float (*pointerArray)[3], int scalar, int length); 

void ArrayMultiplier(float (*pointerArray)[3], int scalar, int length) 
{
    for (int i = 0 ; i < length ; length++)
    {
        for (int j = 0; j < 3; j++)
        { 
            pointerArray[i][j] = pointerArray[i][j] * scalar;
        }
    }
}
其中元素为二维3x3数组:

public float[][] elements = 
        {
            new float[]  {2,5,3},
            new float []  {4,8,6},
            new float []  {5,28,3}
        };
上面给出的代码可以编译,但调用包装器函数时程序崩溃:

Wrapper.ArrayMultiplier(ref elements, scalar, length);
请帮助我,告诉我上面的代码有什么错误,或者如何为一个简单的C++函数编写包装器:< /P>
void SimpleFunction(float (*pointerToArray)[3]);

提前感谢大家

有几种方法可以做到这一点

不安全管线,适用于二维阵列(您有):

    private unsafe float[] MyFunc(float[] inData, int inSize1, int inSize2, int param1, int param2) {
        float[] theOutData = new float[inChannelData.Length];
        fixed (float* inBufferPtr = &inChannelData[0]) {
            fixed (float* outBufferPtr = &theOutData[0]) {
                MyFuncViaDLL((int)inBufferPtr, (int)outBufferPtr, inSize1, inSize2, param);
            }
        }
        return theOutData;
    }
这将以一种不安全的方式工作,但您需要将输入数组更改为1D数组。我认为这是一个更好的主意,但我就是这么想的

如果希望安全起见,请添加另一个与数组本身大小相同的参数,然后进行编组。不过,您还需要进入1D阵列:

相反,您希望执行一些编组,如下所示:

    [DllImport("fastprocessing.dll", EntryPoint = "MyFunc")]
    public static extern void MyFuncViaDLL([MarshalAs(UnmanagedType.LPArray)]float[] inPtr, int size1, int size2, int totalSize, int param2);
然后直接调用函数:

    MyFuncViaDLL(array, size1, size2, size1*size2, param1, param2);
<>你的C++会变成:

void ArrayMultiplier(float *pointerArray, int inSize1, int inSize2, int inTotalSize, int scalar) 
{
    int i, j, index;
    for (i = 0 ; i < size1; i++)//note that length++ would be very very wrong here
    {
        for (j = 0; j < size2; j++)
        { 
            index = i*size2 + j;
            if(index >= inTotalSize) { return; } //avoid walking off the end
            pointerArray[i*size2 +  j] *= scalar;
        }
    }
}
void数组乘法器(float*pointerArray、int-inSize1、int-inSize2、int-inTotalSize、int-scalar)
{
int i,j,索引;
对于(i=0;i=inTotalSize){return;}//避免走到末尾
指针阵列[i*size2+j]*=标量;
}
}
}
如果您愿意,您可以添加对总长度的检查,以确保您不会走到尽头,但这将是一个相当大的速度冲击(足以让您不想使用C++),就好像语句不是免费的一样

然而,在完成了所有这些之后,我不得不问——为什么不直接在C#中完成这项工作,省去诸如编组之类的互操作服务的麻烦呢?对于复杂的事物,C++往往更快,但是对于快速数组的行走,我看到C的行为相当好。在C#中,它也可以非常快,一旦它是1D数组:

 int i;
 for (i = 0; i < array.length; i++){
    array[i] *= scalar;
 }
inti;
对于(i=0;i
有几种方法可以做到这一点

不安全管线,适用于二维阵列(您有):

    private unsafe float[] MyFunc(float[] inData, int inSize1, int inSize2, int param1, int param2) {
        float[] theOutData = new float[inChannelData.Length];
        fixed (float* inBufferPtr = &inChannelData[0]) {
            fixed (float* outBufferPtr = &theOutData[0]) {
                MyFuncViaDLL((int)inBufferPtr, (int)outBufferPtr, inSize1, inSize2, param);
            }
        }
        return theOutData;
    }
这将以一种不安全的方式工作,但您需要将输入数组更改为1D数组。我认为这是一个更好的主意,但我就是这么想的

如果希望安全起见,请添加另一个与数组本身大小相同的参数,然后进行编组。不过,您还需要进入1D阵列:

相反,您希望执行一些编组,如下所示:

    [DllImport("fastprocessing.dll", EntryPoint = "MyFunc")]
    public static extern void MyFuncViaDLL([MarshalAs(UnmanagedType.LPArray)]float[] inPtr, int size1, int size2, int totalSize, int param2);
然后直接调用函数:

    MyFuncViaDLL(array, size1, size2, size1*size2, param1, param2);
<>你的C++会变成:

void ArrayMultiplier(float *pointerArray, int inSize1, int inSize2, int inTotalSize, int scalar) 
{
    int i, j, index;
    for (i = 0 ; i < size1; i++)//note that length++ would be very very wrong here
    {
        for (j = 0; j < size2; j++)
        { 
            index = i*size2 + j;
            if(index >= inTotalSize) { return; } //avoid walking off the end
            pointerArray[i*size2 +  j] *= scalar;
        }
    }
}
void数组乘法器(float*pointerArray、int-inSize1、int-inSize2、int-inTotalSize、int-scalar)
{
int i,j,索引;
对于(i=0;i=inTotalSize){return;}//避免走到末尾
指针阵列[i*size2+j]*=标量;
}
}
}
如果您愿意,您可以添加对总长度的检查,以确保您不会走到尽头,但这将是一个相当大的速度冲击(足以让您不想使用C++),就好像语句不是免费的一样

然而,在完成了所有这些之后,我不得不问——为什么不直接在C#中完成这项工作,省去诸如编组之类的互操作服务的麻烦呢?对于复杂的事物,C++往往更快,但是对于快速数组的行走,我看到C的行为相当好。在C#中,它也可以非常快,一旦它是1D数组:

 int i;
 for (i = 0; i < array.length; i++){
    array[i] *= scalar;
 }
inti;
对于(i=0;i
你为什么不接受这个答案?我觉得不错!你为什么不接受这个答案?我觉得不错!