【发布时间】:2013-03-05 20:55:36
【问题描述】:
是的,需要的东西听起来很简单,但事实证明这是一个真正的痛苦。
我在 C# 中有一些 GUI 代码(注意我以前从未使用过 C#,但对语法很熟悉)并且我有 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*'
希望这能澄清一点。
【问题讨论】:
-
您是否尝试将
cli命名空间添加到array<double>^?像这样:cli::array<double>^ values。请注意,还有一个std::array。可能是因为using namespace-directives 造成的命名空间冲突? -
你的意思是作为 MyFunction() 中的参数吗?
Error 1 error : name followed by "::" must be a class or namespace name是它的结果,然后是许多预期的“)”错误。如果您的意思是在ImageNoiseFiler内部,那没有区别。 -
您实际上并不需要使用 cli 来获得资格。您显示的第三个签名是正确的。当您使用那个时,您会收到什么错误消息?
-
您确定要使用
/clr选项进行编译吗?我假设您是从 VS 中编译的。如果是这样,则应将适当的选项隐藏在 [your-project]->properties 中的某个位置。 -
error : name followed by "::" must be a class or namespace nameerror : expected an identifiererror : invalid combination of type specifierserror : expected a ")"这些是我使用第三个时遇到的错误。 /clr 正在使用,是的。
标签: c# c++ arrays pointers c++-cli