このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
ポインターの受け渡し例
関数multDoubleRef
shrlibsample
ライブラリの関数multDoubleRef
は入力を5
で乗算します。
EXPORTED_FUNCTION double *multDoubleRef(double *x) { *x *= 5; return x; }
入力はdouble
を指すポインターであり、関数はdouble
を指すポインターを返します。MATLAB®関数シグネチャは次のとおりです。
戻り値の型 | 名前 | 引数 |
---|---|---|
[lib.pointer, |
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
ライブラリの関数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
を含むライブラリを読み込みます。
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'