mxSetField (C および Fortran)
インデックスおよびフィールド名を指定して、構造体配列にフィールド値を設定
C 構文
#include "matrix.h" void mxSetField(mxArray *pm, mwIndex index, const char *fieldname, mxArray *pvalue);
Fortran 構文
#include "fintrf.h" subroutine mxSetField(pm, index, fieldname, pvalue) mwPointer pm, pvalue mwIndex index character*(*) fieldname
引数
pm構造体
mxArrayへのポインター。mxIsStructを呼び出して、pmが構造体mxArrayを指しているかどうかを判断します。index配列内の要素のインデックス。
C では、
mxArrayの最初の要素は0のindexをもっています。最後の要素のindexはN-1です。ここで、Nは配列内の要素の数です。Fortran では、mxArrayの最初の要素のindexは1です。最後の要素のindexはNです。ここで、Nは配列内の要素の数です。インデックスの計算の詳細については、
mxCalcSingleSubscriptを参照してください。fieldname構造体内のフィールドの名前。フィールドが構造体内に存在しなければなりません。
mxGetFieldNameByNumberまたはmxGetFieldNumberを呼び出して、既存のフィールド名を判断します。pvaluefieldnameに割り当てるデータを含むmxArrayへのポインター。
説明
mxSetField を使用して、index 要素の fieldname フィールドに pvalue の内容を割り当てます。
fieldname の内容を置換する場合は、まず既存のデータのメモリを解放します。関数 mxGetField を使用してフィールドへのポインターを取得し、ポインターにある mxDestroyArray を呼び出した後、mxSetField を呼び出して新しい値を割り当てます。
構造体内の複数のフィールドや、mxArray 内の複数の要素に pvalue を割り当てることはできません。pvalue の内容を複数のフィールドに割り当てる場合は、関数 mxDuplicateArray を使用してデータをコピーしてから、各コピーに対して mxSetField を呼び出します。
この関数を使用して作成した構造体のメモリを解放するには、構造体配列のみに対して mxDestroyArray を呼び出します。pvalue が指している配列に対しては mxDestroyArray を呼び出さないでください。これを行うと、MATLAB® が同じメモリを 2 回解放しようとするため、メモリが破損する可能性があります。
メモ
MEX ファイルへの入力値は、読み取り専用の定数 mxArray です。入力値を変更しないでください。関数 mxSetCell* または関数 mxSetField* を使用して MATLAB 引数のセルまたはフィールドを変更すると、予期しない結果が生じます。
例
例を開くには、次のように入力します。
edit([fullfile(matlabroot,"extern","examples","mx","filename")]);
ここで filename は、次のようになります。
参考
mxCreateStructArray, mxCreateStructMatrix, mxGetField, mxGetFieldNameByNumber, mxGetFieldNumber, mxGetNumberOfFields, mxIsStruct, mxSetFieldByNumber, mxDestroyArray, mxCalcSingleSubscript
代替方法
C 言語
C では、以下のステートメントを
field_num = mxGetFieldNumber(pa, "fieldname"); mxSetFieldByNumber(pa, index, field_num, new_value_pa);
mxSetField の呼び出しに置換できます。
mxSetField(pa, index, "fieldname", new_value_pa);
Fortran 言語
Fortan では、以下のステートメントを
fieldnum = mxGetFieldNumber(pm, 'fieldname') mxSetFieldByNumber(pm, index, fieldnum, newvalue)
mxSetField の呼び出しに置換できます。
mxSetField(pm, index, 'fieldname', newvalue)
バージョン履歴
R2006a より前に導入