ポインターの受け渡し例
関数 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.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
ライブラリの関数 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)
文字列の戻り値配列
文字列の配列を読み取る関数 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'