主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

構造体の受け渡し例

関数addStructFieldsと関数addStructByRef

サンプルライブラリshrlibsampleには,c_struct構造体入力パラメーターをもつ2つの関数が含まれています。c_structshrlibsample.hヘッダーファイルで定義されています。

Struct c_struct {double p1;短p2;长p3;};

どちらの関数も構造体のフィールドの値を合計します。addStructFieldsへの入力はc_structです。addStructByRefへの入力はc_structを指すポインターです。この関数はまた,値を合計した後にフィールドを変更します。

関数addStructFields

関数addStructFieldsは,c_struct構造体のフィールドの値を合計します。

addStructFields(struct c_struct st) {double t = st.p1 + st.p2 + st.p3;返回t;}

MATLAB®関数シグネチャは次のとおりです。

戻り値の型 名前 引数
addStructFields (struct c_struct)

関数addStructByRef

関数addStructByRefは,c_struct構造体のフィールドの値を合計し,その後フィールドを変更します。この関数は,フィールドを変更する前に合計の計算値を返します。

export_function double addStructByRef(struct c_struct *st) {double t = st->p1 + st->p2 + st->p3;圣- > p1 = 5.5;圣- > p2 = 1234;圣- > p3 = 12345678;返回t;}

関数によって入力引数が変更されるため,MATLABは入力をc_structPtr型の出力引数としても返します。MATLAB関数シグネチャは次のとおりです。

戻り値の型 名前 引数
(双
c_structPtr]
addStructByRef (c_structPtr)

MATLAB構造体を関数に渡し,MATLABで引数を自動変換することができます。あるいは,ポインターを構造体に渡すことで,構造体のコピーが作成されないようにすることもできます。

構造体フィールドの値を合計

この例では,MATLAB構造体を関数addStructFieldsに渡す方法を説明します。

構造体smを作成して初期化します。フィールドはそれぞれ型です。

sm。p1 = 476;sm。p2 = -299;sm。p3 = 1000;

関数addStructFieldsを含むライブラリを読み込みます。

如果不是(libisloaded (“shrlibsample”)目录(fullfile (matlabroot,“外来的”“例子”“shrlib”) loadlibrary (“shrlibsample”结束

関数を呼び出します。MATLABにより、構造体smのフィールドがc_structのライブラリ定義に自動的に変換されます。

calllib (“shrlibsample”“addStructFields”sm)
ans = 1177

値の追加前にMATLAB構造体をあらかじめ変換

この例では,構造体smc_structにあらかじめ変換してからaddStructFieldsを呼び出す方法を説明します。smを関数に繰り返し渡す場合は,あらかじめ変換することで,関数呼び出しごとに構造体を自動変換するためにMATLABで必要とされる処理時間がなくなります。

MATLAB構造体を作成して初期化します。

sm。p1 = 476;sm。p2 = -299;sm。p3 = 1000;

関数addStructFieldsを含むライブラリを読み込みます。

如果不是(libisloaded (“shrlibsample”)目录(fullfile (matlabroot,“外来的”“例子”“shrlib”) loadlibrary (“shrlibsample”结束

型のフィールドを変換して,c_struct構造体型に対応させます。

sc = libstruct (“c_struct”, sm);

フィールド名とその値を表示します。

得到(sc)
P1: 476 p2: -299 p3: 1000

フィールドの値を追加します。

calllib (“shrlibsample”“addStructFields”, sc)
ans = 1177

構造体引数の自動変換

この例では,MATLAB構造体をCライブラリ関数addStructByRefに渡す方法を説明します。構造体を渡すとき、MATLAB はフィールド タイプを自動的に変換しますが、MATLAB はフィールドのコピーも作成します。

ライブラリを読み込みます。

如果不是(libisloaded (“shrlibsample”)目录(fullfile (matlabroot,“外来的”“例子”“shrlib”) loadlibrary (“shrlibsample”结束

構造体を作成します。

S.p1 = 476;S.p2 = -299;S.p3 = 1000;

addStructByRefを呼び出します。

res = calllib (“shrlibsample”“addStructByRef”,年代)
res = 1177

構造体年代はポインターではないため,MATLABはその内容を変更しません。

年代
S =结构体字段:P1: 476 p2: -299 p3: 1000

構造体へのポインターの受け渡し

この例では,ポインターを指定して関数addStructByRefを呼び出すと,入力引数のフィールドがどのように変更されるかを説明します。

如果不是(libisloaded (“shrlibsample”)目录(fullfile (matlabroot,“外来的”“例子”“shrlib”) loadlibrary (“shrlibsample”结束

c_struct型の構造体を作成します。

S.p1 = 20;S.p2 = 99;S.p3 = 3;

構造体を指すポインターspを作成します。

sp = libpointer (“c_struct”,年代);sp.Value
ans =结构体字段:p2: 99 p3: 3

関数にポインターを渡します。

res = calllib (“shrlibsample”“addStructByRef”, sp)
res = 122

ポインターを渡すと,その関数はポインターの指す構造体内のフィールドを変更します。

sp.Value
ans =结构体字段:P1: 5.5000 p2: 1234 p3: 12345678

参考

|

関連する例

詳細