📄 phonebook.c
字号:
/* phonebook.c */
#include "mex.h"
#include "string.h"
#define MAXCHARS 80 //各个域所包含的字符串最大长度
void mexFunction(int nlhs,mxArray *plhs[ ],int nrhs,const mxArray *prhs[ ])
{
const char **fnames; //域名指针
const int *dims;
mxArray *tmp,, *fout;
char *pdata;
int ifield, jstruct, *classIDflags;
int NstructElems, nfields, ndim;
//检查输入输出参数个数
if(nrhs!=1)
mxErrMsgTxt("One input argument required.");
else if(nlhs>1)
mexErrMsgTxt("Too many output argument.");
else if(!mxIsStruct(prhs[0]))
mexErrMsgTxt("Input must be a structure.");
//获取输入参数
nfields=mxGetNumberOfFields(prhs[0]);
NStructElems=mxGetNumberOfElements(prhs[0]);
//为存储classIDflags分配内存
classIDflags=mxCalloc(nfields, sizeof(int));
/* 检查域是否为空,数据类型是否正确,数据类型是否一致,并从
各个域获取classID */
for(ifield=0; ifield<nfields; ifield++)
{
for(jstruct=0;jstruct<NStructElems;jstruct++)
{
tmp=mxGetFieldByNumber(prhs[0], jstruct, ifield);
if(tmp = = NULL)
{
mexPrintf("%s%d\t%s%d\n", "FIELD:", ifield+1,
"STRUCT INDEX:", jstruct+1);
mexErrMsgTxt("Above field is empty");
}
if(jstruct = = 0)
{
if((!mxIsChar(tmp) && !mxIsNumeric(tmp)) || mxIsSparse(tmp))
{
mexPrintf("%s%d\t%s%d\n", "FIELD:", ifield+1,
"STRUCT INDEX:", jstruct+1);
mexErrMsgTxt("Above field must have either
string or numeric non-sparse data.");
}
classIDflags[ifield]=mxGetClassID(tmp);
}
else
{
if(mxGetClassID(tmp) !=classIDflags[ifield])
{
mexPrintf("%s%d\t%s%d\n", "FIELD:", ifield+1,
"STRUCT INDEX:", jstruct+1);
mexErrMsgTxt("Inconsistent data type in above field!");
}
elseif(!mxIsChar(tmp)&&((mxIsComplex(tmp))|| mxGetNumberOfElements(tmp !=1)))
{
mexPrintf("%s%d\t%s%d\n", "FIELD:", ifield+1,
"STRUCT INDEX:", jstruct+1);
mexErrMsgTxt("Numeric data in above field must be
scalar and noncomplex!");
}
}
}
}
//为存储指针分配内存
fnames=mxCalloc(nfields, sizeof(*fnames));
//获取域名指针
for(ifield=0; ifield<nfields; ifield++)
{
fnames[ifield]=mxGetFieldNameByNumber(prhs[0],ifield);
}
//创建一个用于输出的1×1结构体矩阵
plhs[0]=mxCreateStructMatrix(1, 1, nfields, fnames);
mxFree(fnames);
ndim=mxGetNumberOfDimensions(prhs[0]);
dims=mxGetDimensions(prhs[0]);
for(ifield=0; ifield<nfields; ifield++)
{
//创建单元/数值阵列
if(classIDflags[ifield] = = mxCHAR_CLASS)
{
fout=mxCreateCellArray(ndim,dims);
}
else
{
fout=mxCreateNumericArray(ndim, dims, classIDflags[ifield], mxREAL);
pdata=mxGetData(fout);
}
//从输入结构阵列拷贝数据
for(jstruct =0; jstruct<NStructElems; jstruct++)
{
tmp=mxGetFieldByNumber(prhs[0], jstruct, ifield);
if(mxIsChar(tmp))
{
mxSetCell(fout, jstruct, mxDuplicateArray(tmp));
}
else
{
size_t sizebuf;
sizebuf=mxGetElementSize(tmp);
memcpy(pdata, mxGetData(tmp), sizebuf);
pdata +=sizebuf;
}
}
mxSetFieldByNumber(plhs[0], 0, ifield, fout);
}
mxFree(classIDflags);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -