Main Content

ポインターの受け渡し例

関数 multDoubleRef

shrlibsample ライブラリの関数 multDoubleRef は入力を 5 で乗算します。

EXPORTED_FUNCTION double *multDoubleRef(double *x) 
{
     *x *= 5;
     return x;
}

入力は double を指すポインターであり、関数は double を指すポインターを返します。MATLAB® 関数シグネチャは次のとおりです。

戻り値の型名前引数
[lib.pointer,
doublePtr]
multDoubleRef(doublePtr)

double 型のポインターの受け渡し

この例では、ポインターを構成して C 関数 multDoubleRef に渡す方法を説明します。

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

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

入力引数 X を指すポインター Xptr を構築します。

X = 13.3;
Xptr = libpointer('doublePtr',X);

Xptr の内容を確認します。

get(Xptr)
       Value: 13.3000
    DataType: 'doublePtr'

関数を呼び出し、結果を調べます。

calllib('shrlibsample','multDoubleRef',Xptr);
Xptr.Value
ans = 66.5000

Xptr はハンドル オブジェクトです。このハンドルのコピーは基となる同じオブジェクトを参照し、1 つのハンドル オブジェクトで実行される演算はそのオブジェクトのすべてのコピーに影響します。ただし、Xptr は C 言語ポインターではありません。X を指しますが、X のアドレスは含んでいません。関数は、Xptr の Value プロパティを変更しますが、基となるオブジェクト X の値は変更しません。X の元の値はそのままです。

X
X = 13.3000

既存の lib.pointer オブジェクトからのポインター オフセットの作成

この例では、MATLAB ベクトル X のサブセットを指すポインターを作成する方法を説明します。新しいポインターは、元のポインターが存在する間のみ有効です。

ベクトルを指すポインターを作成します。

X = 1:10;
xp = libpointer('doublePtr',X);
xp.Value
ans = 1×10

     1     2     3     4     5     6     7     8     9    10

lib.pointer の加算演算子 (+) を使用して、X の最後の 6 要素を指すポインターを作成します。

xp2 = xp + 4;
xp2.Value
ans = 1×6

     5     6     7     8     9    10

マルチレベル ポインター

"マルチレベル ポインター" とは、複数レベルの参照のある引数のことです。MATLAB のマルチレベル ポインター型は、接尾辞 PtrPtr を使用します。たとえば、C 引数 double ** には doublePtrPtr を使用します。

マルチレベル ポインター引数をとる関数を呼び出す場合は、lib.pointer オブジェクトを使用して、MATLAB でマルチレベル ポインターに変換します。

関数 allocateStruct と関数 deallocateStruct

shrlibsample ライブラリの関数 allocateStructc_structPtrPtr 引数を取ります。

EXPORTED_FUNCTION void allocateStruct(struct c_struct **val) 
{
    *val=(struct c_struct*) malloc(sizeof(struct c_struct));
    (*val)->p1 = 12.4;
    (*val)->p2 = 222;
    (*val)->p3 = 333333;
}

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

戻り値の型名前引数
c_structPtrPtrallocateStruct(c_structPtrPtr)
voidPtr deallocateStruct(voidPtr)

マルチレベル ポインターの受け渡し

この例では、マルチレベル ポインターを C 関数に渡す方法を説明します。

allocateStruct および deallocateStruct を含むライブラリを読み込みます。

if not(libisloaded('shrlibsample'))
    addpath(fullfile(matlabroot,'extern','examples','shrlib'))
    loadlibrary('shrlibsample')
end

c_structPtr ポインターを作成します。

sp = libpointer('c_structPtr');

allocateStruct を呼び出して構造体にメモリを割り当てます。

res = calllib('shrlibsample','allocateStruct',sp)
res = struct with fields:
    p1: 12.4000
    p2: 222
    p3: 333333

関数 allocateStruct で作成されたメモリを解放します。

calllib('shrlibsample','deallocateStruct',sp)

文字列の戻り値配列

文字列の配列を読み取る関数 acquireString を含むライブラリ myLib があるとします。関数シグネチャは次のようになります。

戻り値の型名前引数
char**acquireString(void)
char** acquireString(void)

以下の "疑似コード" は、文字列へのポインターの配列である戻り値を操作する方法を示しています。

ptr = calllib(myLib,'acquireString')

MATLAB は、stringPtrPtr 型の lib.pointer オブジェクト ptr を作成します。このオブジェクトは最初の文字列を指します。他の文字列を表示するには、ポインターをインクリメントします。たとえば、最初の 3 つの文字列を表示するには、以下を入力します。

for index = 0:2
    tempPtr = ptr + index;
    tempPtr.Value
end 
ans = 
    'str1'
ans = 
    'str2'
ans = 
    'str3'

参考