MATLAB 调试C代码
1.环境搭建
1.安装 MinGW-w64 编译器
- 在 MATLAB 主页选项卡的环境部分,点击附加功能 > 获取附加功能
- 搜索 MinGW 或从功能菜单中选择。
2.设置Matlab的编译应用程序mex和编译器mbuild
Matlab编译应用程序mex的设置:mex -setup
Matlab编译器mbuild的设置:mbuild –setup
2.编写入口函数与功能函数
MEX文件的源文件实际上就是一个C语言源文件, MEX的源文件结构由两部分组成:入口子程序和功能子程序。
入口子程序起链接C子程序与MATLAB系统的作用,是实现MATLAB与C混合编程所必须的。格式为:
#include “mex.h”
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
//C语言代码
}
入口子程序函数名必须为mexFunction。
nlhs (number of left-hand side) 是输出参数的个数,nrhs(number of right-hand side) 是输入参数的个数。例如对于c=add(a,b),有nlhs=1,hrhs=2。
prhs[]与plhs[]是指针数组变量,其元素为指向右变量与左变量的指针。
在用户程序中可利用上述指针在C与MATLAB中相互传递数据。MEX函数库里的mexFunction()函数,相当于C语言中的main()函数。MEX源文件没有main(),而是以一个mexFunction()代替。
nlhs (number of left-handside) 是输出参数的个数,nrhs (number of right-hand side) 是输入参数的个数。例如对于c=add(a,b),有nlhs=1,hrhs=2。
prhs[],就是输入的参数,prhs[0]指向a,prhs[1]指向b,但是注意不能用*(prhs[0])得到a的值。因为 prhs[0]指向的东西的类型是mxArray(参数列表里看出),想把它的值以我们常用的数值形式赋给一个标量(Scalar),得使用 mxGetScalar()函数转化一下:
double a, b;
a = mxGetScalar(prhs[0]);
b = mxGetScalar(prhs[1]);
plhs对应的输出的内容。plhs[0]这个指针指向输出的第一个参数,就是c=add(a, b)中的c了。记住这个c应该是以mxArray的类型出现的,为了得到mxArray类型的输出量,要使用mxCreateDoubleMatrix()函数,它创建一个指向mxArray类型的指针。
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
参数(1, 1, mxREAL)定义了对应c的尺寸类型,MATLAB中c是以1×1的实数矩阵形式报保存的。
而使用mxGetPr()函数可以得到plhs[0]指向的mxArray的第一个double类型的指针。
double *c;
c = mxGetPr(plhs[0]);
最后调用add()函数
*c = add(a,b);
功能子程序用于完成一些特定的计算功能或硬件处理功能,由上述的入口子程序调用。如果必要,该程序可与入口子程序合二为一。