⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phonebook.c

📁 这是机械工业张德丰《MATLAB与外部程序接口编程》随书源码
💻 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 + -