構造体の受け渡し例
関数 addStructFields
と関数 addStructByRef
サンプル ライブラリ shrlibsample
には、c_struct
構造体入力パラメーターをもつ 2 つの関数が含まれています。c_struct
は shrlibsample.h
ヘッダー ファイルで定義されています。
struct c_struct { double p1; short p2; long p3; };
どちらの関数も構造体のフィールドの値を合計します。addStructFields
への入力は c_struct
です。addStructByRef
への入力は c_struct
を指すポインターです。この関数はまた、値を合計した後にフィールドを変更します。
関数 addStructFields
関数 addStructFields
は、c_struct
構造体のフィールドの値を合計します。
EXPORTED_FUNCTION double addStructFields(struct c_struct st) { double t = st.p1 + st.p2 + st.p3; return t; }
MATLAB® 関数シグネチャは次のとおりです。
戻り値の型 | 名前 | 引数 |
---|---|---|
double | addStructFields | (struct c_struct) |
関数 addStructByRef
関数 addStructByRef
は、c_struct
構造体のフィールドの値を合計し、その後フィールドを変更します。この関数は、フィールドを変更する前に合計の計算値を返します。
EXPORTED_FUNCTION double addStructByRef(struct c_struct *st) { double t = st->p1 + st->p2 + st->p3; st->p1 = 5.5; st->p2 = 1234; st->p3 = 12345678; return t; }
関数によって入力引数が変更されるため、MATLAB は入力を c_structPtr
型の出力引数としても返します。MATLAB 関数シグネチャは次のとおりです。
戻り値の型 | 名前 | 引数 |
---|---|---|
[double, | addStructByRef | (c_structPtr) |
MATLAB 構造体を関数に渡し、MATLAB で引数を自動変換することができます。あるいは、ポインターを構造体に渡すことで、構造体のコピーが作成されないようにすることもできます。
構造体フィールドの値を合計
この例では、MATLAB 構造体を関数 addStructFields
に渡す方法を説明します。
構造体 sm
を作成して初期化します。フィールドはそれぞれ double
型です。
sm.p1 = 476; sm.p2 = -299; sm.p3 = 1000;
関数 addStructFields
を含むライブラリを読み込みます。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
関数を呼び出します。MATLAB により、構造体 sm
のフィールドが c_struct
のライブラリ定義に自動的に変換されます。
calllib('shrlibsample','addStructFields',sm)
ans = 1177
値の追加前に MATLAB 構造体をあらかじめ変換
この例では、構造体 sm
を c_struct
にあらかじめ変換してから addStructFields
を呼び出す方法を説明します。sm
を関数に繰り返し渡す場合は、あらかじめ変換することで、関数呼び出しごとに構造体を自動変換するために MATLAB で必要とされる処理時間がなくなります。
MATLAB 構造体を作成して初期化します。
sm.p1 = 476; sm.p2 = -299; sm.p3 = 1000;
関数 addStructFields
を含むライブラリを読み込みます。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
double
型のフィールドを変換して、double
、short
、long
の c_struct
構造体型に対応させます。
sc = libstruct('c_struct',sm);
フィールド名とその値を表示します。
get(sc)
p1: 476 p2: -299 p3: 1000
フィールドの値を追加します。
calllib('shrlibsample','addStructFields',sc)
ans = 1177
構造体引数の自動変換
この例では、MATLAB 構造体を C ライブラリ関数 addStructByRef
に渡す方法を説明します。構造体を渡すとき、MATLAB はフィールド タイプを自動的に変換しますが、MATLAB はフィールドのコピーも作成します。
ライブラリを読み込みます。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
構造体を作成します。
S.p1 = 476; S.p2 = -299; S.p3 = 1000;
addStructByRef
を呼び出します。
res = calllib('shrlibsample','addStructByRef',S)
res = 1177
構造体 S
はポインターではないため、MATLAB はその内容を変更しません。
S
S = struct with fields:
p1: 476
p2: -299
p3: 1000
構造体へのポインターの受け渡し
この例では、ポインターを指定して関数 addStructByRef
を呼び出すと、入力引数のフィールドがどのように変更されるかを説明します。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
c_struct
型の構造体を作成します。
S.p1 = 20; S.p2 = 99; S.p3 = 3;
構造体を指すポインター sp
を作成します。
sp = libpointer('c_struct',S);
sp.Value
ans = struct with fields:
p1: 20
p2: 99
p3: 3
関数にポインターを渡します。
res = calllib('shrlibsample','addStructByRef',sp)
res = 122
ポインターを渡すと、その関数はポインターの指す構造体内のフィールドを変更します。
sp.Value
ans = struct with fields:
p1: 5.5000
p2: 1234
p3: 12345678