Main Content

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

参考