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



但是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);
}

最佳答案

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



在您的情况下,我假设虽然看起来像您传入了整数,但实际上它是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 或ojit_a检查输入的类型。
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;
}

关于c++ - 使用mxGetPr和mxGetData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41852896/

10-12 23:50