2017-01-25 27 views
1

我想写一个简单的mex函数。我有一个整数输入,这是我的对象的数量。 当我编译myMEX_1.cpp并通过MATLAB与任何输入值调用它,我总是得到:使用mxGetPr vs mxGetData

Number请求的对象:= 0

myMEX_2.cpp工作正常,表明从MATLAB输入的数命令窗口。 myMEX_1.cpp我的错误在哪里?

我的环境:MATLAB R2013a和Microsoft SDK 7.1编译器。

// myMEX_1.cpp 
#include "mex.h" 
void mexFunction(int nlhs,  mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 
{ 

    char str11[100]; 
    unsigned short frameCount; 
    //unsigned short *frameCountPtr; 
    frameCount = (*((unsigned short*)mxGetData(prhs[0]))); 
    sprintf(str11, "Number of Requested Objects := %d:\n", frameCount); 
    mexPrintf(str11); 
} 





// myMEX_2.cpp 
#include "mex.h" 
void mexFunction(int nlhs,  mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 
{ 
    char str11[100]; 
    unsigned short frameCount; 
    double* dblPointer; 
    dblPointer = mxGetPr(prhs[0]); 
    frameCount = (unsigned short)(*dblPointer); 
    sprintf(str11, "Number of Requested Objects := %d:\n", frameCount); 
    mexPrintf(str11); 
} 

回答

3

mxGetData返回void指针必须强制转换为正确数据类型的指针。

在C中,mxGetData返回void指针(void *)。由于void指针指向一个没有类型的值,的返回值强制转换为指针类型,通过pm

在你的情况下指定的类型相匹配,我假设,虽然它看起来像你”它实际上是一个double,因为这是MATLAB的默认数据类型,所以你的问题是由于你试图将它转换为unsigned short指针。

myMEX_1(1)   % Passes a double 
myMEX_1(uint16(1)) % Passes an integer 

为了解决这个问题,我们就需要转换的mxGetData输出为double指针代替,然后取消对它的引用,投它并为它分配

frameCount = (unsigned short)*(double*)mxGetData(prhs[0]); 

mxGetPr相同mxGetData除了它会自动将mxGetData的输出作为double指针投出。因此,它为您节省了一个步骤,但仅适用于double输入(您有)。

如果您想要适当地处理多种类型的输入,则需要使用mxIsDoublemxIsClass来检查输入的类型。

if (mxIsDouble(prhs[0])) { 
    frameCount = (unsigned short)*mxGetPr(prhs[0]); 
} else if (mxIsClass(prhs[0], "uint16") { 
    frameCount = *(unsigned short*)mxGetData(prhs[0]); 
} else { 
    mexPrintf("Unknown datatype provided!"); 
    return; 
} 
+0

'mxGetPr'总是返回与输入参数类型无关的'* double'。 – GntS

+0

@GmtK我认为,但只是检查出来。虽然你的代码可以工作,如果你真的*传递一个整数:'myMEX_1(uint16(1))' – Suever

+0

函数原型在MATLAB帮助中作为'double * mxGetPr(const mxArray * pm);' – GntS