Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MATLAB mex API与MATLAB引擎API之间的差异_C++_Matlab - Fatal编程技术网

C++ MATLAB mex API与MATLAB引擎API之间的差异

C++ MATLAB mex API与MATLAB引擎API之间的差异,c++,matlab,C++,Matlab,我很难通过matlab的引擎API获取(并因此设置)图形对象的属性:我总是在以下代码中获取空指针(我在windows 8.1上使用R2015b): getMex.cpp源文件: #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { //some input/output checks here mxArray *p = mx

我很难通过matlab的引擎API获取(并因此设置)图形对象的属性:我总是在以下代码中获取空指针(我在windows 8.1上使用R2015b):

getMex.cpp源文件:

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
             const mxArray *prhs[])
{
  //some input/output checks here
  mxArray *p = mxGetProperty(prhs[0],0,"LineWidth");  //OK!!! - not NULL
  double *p2h=mxGetPr(p);//OK!!! *p2h = 2.5
  plhs[0] = p;
}
在VS2010中调试mex代码和引擎代码时,我看到了这一点 相同的DLL被精确加载

我的引擎API代码有什么问题


我在这里遗漏了什么?

嗯,显然这是不可能的):,这是我从mathworks支持部门得到的答案:

不能在C/C++MATLAB引擎代码中使用MEXAPI函数。客户可以使用MeX API从MATLAB脚本调用C、C++或FORTRAN代码。MATLAB引擎API支持MATLAB和C/C++之间的相反交互。使用Matlab引擎,客户可以利用MATLAB中的功能,在C或C++代码中。 这两个API之间的区别解释了为什么MEX API函数“mxGetProperty”在MEX文件“getMex.cpp”中返回正确的“LineWidth”值,但在MATLAB引擎实现中返回NULL

然而,您的用例揭示了MATLAB中当前存在的两个差异:

  • 我们的文档没有说明MEXAPI不应在MATLAB引擎的上下文中使用。如果在MATLAB引擎代码中使用MEX函数,我们也不会向用户显示任何错误消息。我已经在一个增强请求中向我们的开发组织提交了此反馈

  • 您可以在MATLAB中使用“mxGetClassName”,这是一个MEX函数 发动机代码。这样做与MEX函数不应该在MATLAB引擎中工作这一事实相矛盾。我已经让开发人员知道“mxGetClassName”可以与MATLAB引擎一起使用

  • mex getMex.cpp;%compile getMex.cpp (with VS 2010 Ultimate), see code below
    clearvars;close all;x=linspace(-pi,pi);figure;h=plot(x,sin(x),'o-b','LineWidth',2.5);%OK!! got the plot on a new figure
    LineWidth = getMex(h);% OK!!  LineWidth = 2.5
    
    #include "mex.h"
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
                 const mxArray *prhs[])
    {
      //some input/output checks here
      mxArray *p = mxGetProperty(prhs[0],0,"LineWidth");  //OK!!! - not NULL
      double *p2h=mxGetPr(p);//OK!!! *p2h = 2.5
      plhs[0] = p;
    }