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

📄 phonebook.c

📁 matlab实用教程
💻 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 mwSize *dims;
    mxArray    *tmp, *fout;
    char       *pdata=NULL;
    int        ifield, nfields;
    mxClassID  *classIDflags;
    mwIndex    jstruct;
    mwSize     NStructElems;
    mwSize     ndim;
 
    /* 检查输入/输出参数 */
    if(nrhs!=1)
      mexErrMsgTxt("One input required.");
    else if(nlhs > 1)
      mexErrMsgTxt("Too many output arguments.");
    else if(!mxIsStruct(prhs[0]))
      mexErrMsgTxt("Input must be a structure.");
    /* 获取输入参数 */
    nfields = mxGetNumberOfFields(prhs[0]);
    NStructElems = mxGetNumberOfElements(prhs[0]);
    /* 为存储classIDflags分配内存 */
    classIDflags = mxCalloc(nfields, sizeof(mxClassID));
 
    /* 检查空域、数据类型以及数据类型一致性,获取每个域的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!"); 
        } else if(!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((void *)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 {
          mwSize     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 + -