ポインターの受け渡し例
関数 multDoubleRef
shrlibsample ライブラリの関数 multDoubleRef は入力を 5 で乗算します。
EXPORTED_FUNCTION double *multDoubleRef(double *x)
{
*x *= 5;
return x;
}入力は double を指すポインターであり、関数は double を指すポインターを返します。MATLAB® 関数シグネチャは次のとおりです。
| 戻り値の型 | 名前 | 引数 |
|---|---|---|
[lib.pointer, | 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.Valueans = 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 ライブラリの関数 allocateStruct は c_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 を含むライブラリを読み込みます。
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)
ans = libpointer
文字列の戻り値配列
文字列の配列を読み取る関数 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'