主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

共有Cライブラリ関数への引数の受け渡し

Cの型と対応するMATLABの型

共有ライブラリインターフェイスはすべての標準スカラーのCの型をサポートしています。次の表はCの型とそれに対応するMATLAB®の型の一覧です。MATLABは、左の列に示された C の型をもつ引数について、右の列の型を使用します。

メモ

MATLABによって返されるスカラー値はすべて,型です。

MATLABプリミティブ型

Cの型 対応するMATLABの型

字符字节

int8

无符号字符字节

uint8

int16

无符号短

uint16

int

int32

(Windows®

int32

(Linux®

int64

无符号整型

uint32

无符号长(窗口)

uint32

无符号长(Linux)

uint64

浮动

char *

字符配列(1行n列)

* char []

文字ベクトルの细胞配列

次の表は,MATLABがCポインター(1列目)を対応するMATLAB関数シグネチャ(2列目)にマッピングする方法を示しています。通常,変数は”等価なMATLAB型”列から,対応する”引数データ型”をもつ関数に渡すことができます。lib.pointerオブジェクトを代わりに使用する場合の詳細については,C関数内でのポインター引数を参照してください。

MATLABの拡張型

Cポインターの型 引数
データ型
等価な
MATLAB型

共有ライブラリshrlibsample
における関数の例

双*

doublePtr

addDoubleRef

浮*

singlePtr

int大小(整数ポインターの型)

(u) int (大小) Ptr
たとえば,int64 *int64Ptrになります。

(u) int (大小 multiplyShort

byte []

int8Ptr

int8

char [](値により渡される零終端文字列)

装运箱

字符配列(1行n列)

stringToUpper

char * *(文字列を指すポインターの配列)

stringPtrPtr

文字ベクトルの细胞配列

枚举

enumPtr

类型**

类型PtrPtr
たとえば,双* *
doublePtrPtrになります。

lib.pointerオブジェクト

allocateStruct

void *

voidPtr

deallocateStruct

void * *

voidPtrPtr

lib.pointerオブジェクト

结构体(Cスタイルの構造体)

结构

MATLAB结构体

addStructFields

mxArray *

MATLAB数组

MATLAB配列

mxArray * *

MATLAB arrayPtr

lib.pointerオブジェクト

MATLABによる関数シグネチャの表示方法

MATLABの関数シグネチャに示された入出力引数について,いくつかの注意事項を以下に示します。

  • 多くの引数(int32のような)はCのそれと似ています。こうした場合は,その引数に対して示されるMATLAB型のみを渡します。

  • 一部のC引数(たとえば,* *的两倍や定義済みの構造体)は標準のMATLABの型とは異なります。こうした場合は,標準のMATLAB型を渡してMATLABに変換させるか,あるいはMATLAB関数libstructおよびlibpointerを使用してデータを自分で変換します。詳細は,関数に渡されるデータの手動変換を参照してください。

  • C関数はしばしば,参照によって渡される入力引数のデータを返します。MATLABでは、これらの値を返すための追加の出力引数が作成されます。PtrまたはPtrPtrで終わる入力引数は,出力引数としてもリストされています。

MATLAB関数シグネチャの例は,共有ライブラリshrlibsampleを参照してください。

引数受け渡しのガイドライン

  • ライブラリ関数では,非スカラー引数は参照により渡されることを宣言しなければなりません。

  • ライブラリ関数が単一の添字インデックスを使用して2次元行列を参照する場合,Cプログラムは行列を行ごとに処理することに注意してください。MATLABは行列を列ごとに処理します。関数から C の動作を取得するには、関数を呼び出す前に入力行列を転置し、その後関数出力を転置します。

  • 空の配列[]を使用して,オプションの入力引数をサポートしているライブラリ関数にパラメーターを渡します。この表記は,libfunctionslibfunctionsviewによって示されるように,PtrまたはPtrPtrとして引数が宣言される場合にのみ有効です。

零ポインター

ライブラリ関数に渡すポインターは以下の方法により作成できます。

  • 引数として空配列[]を渡します。

  • 関数libpointerを使用します。

    p = libpointer;%没有参数
    P = libpointer('string') % string参数
    P = libpointer('cstring') %指向字符串参数的指针
  • 関数libstructを使用します。

    p = libstruct(“structtype”);%结构类型

空のlibstructオブジェクト

空のlibstructオブジェクトを作成するには,libstructstructtype引数のみで呼び出します。以下に例を示します。

sci = libstruct (“c_struct”) (sci)
P1: 0 p2: 0 p3: 0

MATLABに初期化された値が表示されます。

関数に渡されるデータの手動変換

ほとんどの場合,MATLABソフトウェアは,外部ライブラリ関数との間で受け渡しされるデータを,外部関数で想定されるデータ型に自動的に変換します。しかし,引数データの手動による変換も選択できます。以下に例を示します。

  • 同じデータを一連のライブラリ関数に渡す場合,呼び出しのたびにMATLABでデータを自動変換する代わりに,最初の関数の呼び出し前に手動で一度変換します。この手法より,不要なコピーおよび変換操作の数が削減されます。

  • 大規模な構造体を渡す場合,汎用のMATLAB構造体を使用する代わりに関数で使用されるC構造体の形状と一致するMATLAB構造体を作成することで,メモリを節約します。関数libstructは,ライブラリから取得したC構造体をモデルとしたMATLAB構造体を作成します。

  • 外部関数に対する引数で複数のレベルの参照が使用される場合(双* *など),MATLABによる型の自動変換に頼らず,関数libpointerを使用して作成したポインターを渡します。

参考

|||

関連する例

詳細