Main Content

構造体の受け渡し例

関数 addStructFields と関数 addStructByRef

サンプル ライブラリ shrlibsample には、c_struct 構造体入力パラメーターをもつ 2 つの関数が含まれています。c_structshrlibsample.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® 関数シグネチャは次のとおりです。

戻り値の型名前引数
doubleaddStructFields(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,
c_structPtr]
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 構造体をあらかじめ変換

この例では、構造体 smc_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 型のフィールドを変換して、doubleshortlongc_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

参考

|

関連する例

詳細