我正在尝试编写一个简单的mex函数。我有一个整数输入,它是我的对象的数目。当我用任何输入值编译myMEX_1.cpp
并通过MATLAB调用它时,我总是得到:
请求对象的数量( := 0)
但是myMEX_2.cpp
工作得很好,显示了从MATLAB命令窗口输入的数字。我在myMEX_1.cpp
中的错误在哪里?
我的环境: MATLAB R2013a和MicrosoftSDK7.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);
}
发布于 2017-01-25 14:01:28
mxGetData
返回一个必须转换为正确数据类型的指针的void
指针。
在C中,
mxGetData
返回一个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
输入(这是您拥有的)。
如果希望适当地处理多个类型的输入,则需要使用mxIsDouble
或mxIsClass
检查输入的类型。
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;
}
https://stackoverflow.com/questions/41852896
复制相似问题