C 共有ライブラリ関数内でのポインター引数の表現
C 関数内でのポインター引数
外部ライブラリの多くの関数は、参照によって引数を受け渡します。参照で渡すときは、値への "ポインター" を渡します。関数シグネチャでは、ポインター引数に Ptr
および PtrPtr
で終わる名前が付いています。MATLAB® では参照による受け渡しをサポートしていませんが、C ポインターと互換性のある "lib.pointer オブジェクト" と呼ばれる MATLAB 引数を作成できます。このオブジェクトは、MATLAB lib.pointer
クラスのインスタンスです。
多くの場合、関数のシグネチャが引数をポインターとして宣言している場合でも、MATLAB 変数をそのまま渡すことができます (値による引数の受け渡し)。ただし、lib.pointer
を渡すほうが便利な場合もあります。
入力引数のデータを変更する場合。
大容量のデータを渡す場合および MATLAB によるそのデータ コピー作成時の制御を行う場合。
ライブラリでポインターの保存と使用が行われるため、
lib.pointer
オブジェクトの有効期間を MATLAB 関数で制御する場合。
Void ポインターへの文字列の配置
C では文字が 8 ビットの整数として表現されます。入力引数として MATLAB 文字配列を使用するには、文字列を正しい型に変換し、voidPtr
を作成します。以下に例を示します。
str = 'string variable'; vp = libpointer('voidPtr',[int8(str) 0]);
構文 [int8(str) 0]
は、C 関数で必要な null 終端文字列を作成します。文字列を読み取り、ポインターの型を確認するには、以下を入力します。
char(vp.Value) vp.DataType
ans = string variable ans = voidPtr
MATLAB は、外部関数プロトタイプで引数がポインターとして定義されている場合、値で渡される引数を参照して渡される引数に自動的に変換します。次の構文を使用して、文字列に対する voidPtr
を入力引数として取る関数を呼び出します。
func_name([int8(str) 0])
MATLAB は引数を値からポインターに変換しますが、それは正しい型でなければなりません。
外部ライブラリに対するメモリの割り当て
通常、MATLAB は、ライブラリ関数に変数が渡されるたびに、有効なメモリ アドレスを渡します。ライブラリがポインターを格納して長期間バッファーにアクセスする場合は、lib.pointer
オブジェクトを使用します。こうした場合、MATLAB がバッファーの有効期間を制御できることを確認し、データのコピーが作成されないようにします。次の疑似コードは非同期データ収集の例であり、この状況で lib.pointer
を使用する方法を示します。
外部ライブラリ myLib
に次の関数があるとします。
AcquireData(int points,short *buffer) IsAquisitionDone(void)
ここで、buffer
は次のように宣言されます。
short buffer[99]
まず、99 個のポイントからなる配列を指す lib.pointer
を作成します。
BufferSize = 99; pBuffer = libpointer('int16Ptr',zeros(BufferSize,1));
次に、データの取得を開始し、それが完了するまでループで待機します。
calllib('myLib','AcquireData,BufferSize,pbuffer) while (~calllib('myLib','IsAcquisitionDone') pause(0.1) end
次のステートメントは、バッファー内のデータを読み取ります。
result = pBuffer.Value;
ライブラリがバッファーの使用を終了した後、MATLAB 変数をクリアします。
clear pBuffer