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
你为什么不接受这个答案?我觉得不错!你为什么不接受这个答案?我觉得不错!