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
を呼び出して、既存のフィールド名を判断します。pvalue
fieldname
に割り当てるデータを含むmxArray
へのポインター。
説明
mxSetField
を使用して、index
要素の fieldname
フィールドに pvalue
の内容を割り当てます。
fieldname
の内容を置換する場合は、まず既存のデータのメモリを解放します。関数 mxGetField
を使用してフィールドへのポインターを取得し、ポインターにある mxDestroyArray
を呼び出した後、mxSetField
を呼び出して新しい値を割り当てます。
構造体内の複数のフィールドや、mxArray
内の複数の要素に pvalue
を割り当てることはできません。pvalue
の内容を複数のフィールドに割り当てる場合は、関数 mxDuplicateArray
を使用してデータをコピーしてから、各コピーに対して mxSetField
を呼び出します。
この関数を使用して作成した構造体のメモリを解放するには、構造体配列のみに対して mxDestroyArray
を呼び出します。pvalue
が指している配列に対しては mxDestroyArray
を呼び出さないでください。これを行うと、MATLAB® が同じメモリを 2 回解放しようとするため、メモリが破損する可能性があります。
メモ
MEX ファイルへの入力値は、読み取り専用の定数 mxArray
です。入力値を変更しないでください。関数 mxSetCell
*
または関数 mxSetField
*
を使用して MATLAB 引数のセルまたはフィールドを変更すると、予期しない結果が生じます。
参考
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 より前に導入