是的,需要的东西听起来很简单,但事实证明这是一个真正的痛苦。
我有一些C#中的 GUI 代码(注意我以前从未使用过 C#,但熟悉语法)并且我有C++代码,它使用CLI与之交互。
在 C# 中,我想创建一个双精度数组,并将其发送到我的 C++ 代码。我使用下面的代码作为传递数组的方法,并且这是孤立地遵守的。
因此,从 C# 中,我将一个 double[] 数组传递给该函数。
public ref class KernelWrapper
{
public:
static void ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, array<double>^ values);
我应该使用什么参数类型从 C++ 端检索这个数组?
我试过了:
MyFunction(double values[]){}
MyFunction(double* values){}
MyFunction(array<double>^ values){}
但没有编译,通常最后一个带有“数组不是模板”的消息,并且
Error 1 error C2664: 'RunImageNoiseFilterKernel' : cannot convert parameter 4 from 'cli::array<Type> ^' to 'double *'
任何关于如何实现这一点的提示将不胜感激。
为了可读性,我在这里更新代码
.cpp 文件:
void Bangor::KernelWrapper::ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, pin_ptr<double> pval){
RunImageNoiseFilterKernel((Format24bppRgb*)((int)imageData), imageWidth, imageHeight); //If parameter would work, 4th argument would also be passed into this.
}
C#代码:
double[] randomValues = new double[ARRAY_LENGTH]; //Array of random numbers
KernelWrapper.ImageNoiseFilter(ptr, image.Width, image.Height, randomValues);
错误是:
Error 1 error C3824: 'cli::pin_ptr<Type>': this type cannot appear in this context (function parameter, return type, or a static member)
Error 3 The best overloaded method match for 'Bangor.KernelWrapper.ImageNoiseFilter(System.IntPtr, int, int, double*)' has some invalid arguments
Error 4 Argument 4: cannot convert from 'double[]' to 'double*'
希望这能澄清一点。