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に渡す方法を説明します。

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

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

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

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

Xptrの内容を確認します。

get (Xptr)
价值: 13.3000 DataType: 'doublePtr'

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

calllib('shrlibsample','multDoubleRef', Xptr);Xptr。价值
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×101 2 3 4 5 6 7 8 9 10

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

xp2 = xp + 4; xp2.Value
ans =1×65 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_structPtrPtr allocateStruct (c_structPtrPtr)
voidPtr deallocateStruct (voidPtr)

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

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

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

ifnot(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'

参考