我想使用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'。
任何人都可以帮我解决这个问题! 谢谢!
答案 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
对象以取消引用它。