无法将参数2从'mxArray **'转换为'mwArray&'

时间:2013-05-04 12:10:37

标签: c++ matlab c++-cli

我想使用deloytool从Matlab创建一个C ++共享库,并在MVS中使用它。我编译了一个函数名'foo.m',结果得到了文件列表(.h,.cpp,.lib,...),我发现'fooCpplib.h'中的函数如下:

extern LIB_fooCpplib_CPP_API void MW_CALL_CONV foo(int nargout, mwArray& y, const mwArray& x);

然后我创建了一个MVS项目(2010),窗体表单应用程序,带有2个文本框和2个单击按钮,一个名为inBox的文本框,另一个名为outBox。 button_click中的代码如下:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
double input = System::Double::Parse(inBox->Text);
mxArray *x_ptr;
mxArray *y_ptr=NULL;
double *y;

// Create an mxArray to input into mlfFoo
x_ptr = mxCreateDoubleScalar(input);

// Call the implementation function 
// Note the second input argument should be &y_ptr instead of y_ptr. 
foo(1,&y_ptr,x_ptr);

// The return value from mlfFoo is an mxArray. 
// Use mxGetpr to get a pointer to data it contains.
y = (double*)mxGetPr(y_ptr);

// display the result in the form
outBox->Text = ""+*y;

//clean up memory
mxDestroyArray(x_ptr);
mxDestroyArray(y_ptr);
}

构建项目时,错误发生如下:

error C2664: 'foo' : cannot convert parameter 2 from 'mxArray **' to 'mwArray &'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style
cast.

注意:我已经在.cpp源文件中包含了'fooCpplib.h'。

任何人都可以帮我解决这个问题! 谢谢!

2 个答案:

答案 0 :(得分:2)

当参数声明为

TypeName &argName

这意味着argName是一个参考。在C ++中,您可以通过引用传递参数,这允许函数修改传递给它的变量(以及其他内容)。

如果你有一个指针,但函数需要引用,你需要用星号取消引用调用中的指针,而不是用带符号的指针地址:

foo(1,*y_ptr,*x_ptr);
//    ^      ^
//    |      |
//  Here and here

您可以根据间接级别来考虑变量,指针,指针指针等。变量具有零间接的水平;指针具有一个间接的水平;指向指针的指针具有两个间接的等级,依此类推。

添加&符号会增加间接级别;添加星号会减少它。与变量一样,引用的间接级别为零。如果你有一个指针而你需要一个变量,你必须通过添加一个星号来降低间接水平。

您的代码中的另一个问题是,foo期望引用mwArray,使用" w",但您要传递对mxArray的引用,并带有& #34; X&#34 ;.类型需要匹配,否则编译器不会采用你的程序。

答案 1 :(得分:1)

mwArray&是参考类型。这是“mwArray的参考”。但是,您尝试传递&y_ptr,它会为您提供mwArray**或“指向mwArray的指针”。相反,您应取消引用y_ptr以获得可以通过引用传递的mwArray。第三个论点也是如此。

foo(1,*y_ptr,*x_ptr);

但是,您还有另一个问题,即y_ptr为空。您需要它指向mwArray对象以取消引用它。