如何正确向MEX函数传递输入参数并获取返回的输出结果?
问题原因与修复方案
1. 输入参数传递错误根因
mxGetScalar 固定返回double类型值,如果你在Matlab侧传入的index是枚举类非double类型,直接强转成自定义枚举new_type就会出现值解析错误。你后续将输入转成double再传入的处理是正确的,也可以在MEX代码内增加类型校验逻辑,避免传参类型错误导致异常。
2. Flag输出异常根因
原代码存在明显逻辑错误:
- 先创建了
plhs[0]的输出矩阵,此时矩阵内初始值为0,你把这个初始0值赋值给了Flag变量 - 后续调用
src_Function更新了Flag变量的值,但没有把更新后的Flag值写回plhs[0]对应的内存地址,所以Matlab侧永远只能读到初始的0值。
修正后的完整MEX代码
#include "mex.h" #include "math.h" #include "source.c" #define MXCLASS mxSINGLE_CLASS void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { /* 输入输出参数校验(可选,建议添加避免非法调用崩溃) */ if(nrhs != 1) { mexErrMsgIdAndTxt("MyMEX:InvalidInput", "仅需传入1个输入参数"); } if(nlhs != 2) { mexErrMsgIdAndTxt("MyMEX:InvalidOutput", "需要指定2个输出参数"); } if(!mxIsDouble(prhs[0]) || mxGetNumberOfElements(prhs[0]) != 1) { mexErrMsgIdAndTxt("MyMEX:InputTypeError", "输入参数必须为标量double类型"); } /* 变量定义 */ new_type Index; INTEGER Flag; FLOAT *Result; INTEGER *FlagPtr; // 用于指向输出Flag的内存地址 /* 读取输入参数 */ Index = (new_type)mxGetScalar(prhs[0]); /* 创建输出矩阵 */ plhs[0] = mxCreateNumericMatrix(1,1,mxINT16_CLASS,mxREAL); plhs[1] = mxCreateNumericMatrix(1,1,MXCLASS,mxREAL); /* 获取输出矩阵的内存指针 */ FlagPtr = (INTEGER *)mxGetPr(plhs[0]); Result = (FLOAT *)mxGetPr(plhs[1]); /* 调用子例程,直接把Flag值写入输出内存地址 */ *FlagPtr = src_Function(Index, Result); }
Matlab调用说明
你调整后的调用方式可以继续使用:
[flag,result] = feval('src_Function_mex',double(index));
如果添加了代码里的输入类型校验逻辑,传参类型错误时会直接抛出明确提示,无需再猜测参数解析错误问题。
内容的提问来源于stack exchange,提问作者e_frost
相关产品推荐
相关产品推荐

