首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mxGetPr和mxGetData

使用mxGetPr和mxGetData
EN

Stack Overflow用户
提问于 2017-01-25 13:30:10
回答 1查看 2.9K关注 0票数 2

我正在尝试编写一个简单的mex函数。我有一个整数输入,它是我的对象的数目。当我用任何输入值编译myMEX_1.cpp并通过MATLAB调用它时,我总是得到:

请求对象的数量( := 0)

但是myMEX_2.cpp工作得很好,显示了从MATLAB命令窗口输入的数字。我在myMEX_1.cpp中的错误在哪里?

我的环境: MATLAB R2013a和MicrosoftSDK7.1编译器。

代码语言:javascript
运行
复制
// 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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-25 14:01:28

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

在C中,mxGetData返回一个void指针(void *)。由于pm指针指向没有类型的值,因此将返回值转换为与指定的类型匹配的指针类型。

在您的例子中,我假设虽然它看起来像是传递了一个整数,但是它实际上是一个double,因为这是MATLAB的默认数据类型,所以您的问题是因为您试图将它转换为一个unsigned short指针。

代码语言:javascript
运行
复制
myMEX_1(1)          % Passes a double
myMEX_1(uint16(1))  % Passes an integer

要解决这个问题,我们需要将mxGetData的输出转换为一个double指针,然后取消引用、转换并分配它。

代码语言:javascript
运行
复制
frameCount = (unsigned short)*(double*)mxGetData(prhs[0]);

mxGetPrmxGetData相同,只不过它会自动将mxGetData的输出转换为double指针。因此,它为您节省了一个步骤,但只适用于double输入(这是您拥有的)。

如果希望适当地处理多个类型的输入,则需要使用mxIsDoublemxIsClass检查输入的类型。

代码语言:javascript
运行
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档