主要内容

将参数传递给共享C库函数

C和MATLAB等效类型

共享库接口支持所有标准标量C类型。下表显示了这些C类型及其万博1manbetx等效的MATLAB®MATLAB使用右列中的类型作为左列中显示的C类型的参数。

笔记

MATLAB返回的所有标量值都是双重的.

MATLAB基本类型

C型 等效MATLAB类型

烧焦,字节

int8

无符号字符,字节

uint8

短的

int16

无符号短

uint16

int

int32

长的(窗户®)

int32,
长的

长的(Linux®)

int64,
长的

无符号整型

uint32

无符号长(窗口)

uint32,
长的

无符号长(Linux)

uint64,
长的

浮动

仅有一个的

双重的

双重的

煤焦*

烧焦阵列(1xn)

*字符[]

字符向量单元数组

下表显示了MATLAB如何将C指针(第1列)映射到等效的MATLAB函数签名(第2列)。通常,您可以将等效MATLAB类型列中的变量传递给具有相应参数数据类型的函数。看见C函数中的指针参数有关何时使用lib.pointer反对。

MATLAB扩展类型

C指针类型 论点
数据类型
相等的
MATLAB类型

中的示例函数
共享库shribSample

双重的*

倍频器

双重的 addDoubleRef

浮动*

singlePtr

仅有一个的

int大小*(整数指针类型)

(u) int(大小)Ptr
例如int64*变成int64Ptr.

(u) int(大小) 多倍短

字节[]

int8Ptr

int8

字符[](通过值传递的以null结尾的字符串)

烧焦阵列(1xn)

Stringtouper

煤焦**(指向字符串的指针数组)

stringPtrPtr

字符向量单元数组

枚举

枚举器

类型**

类型PtrPtr
例如双重的**
变成双PTRPTR.

lib.pointer对象

分配结构

空虚*

空隙率

deallocateStruct

空虚**

空隙率

lib.pointer对象

结构(C型结构)

结构

MATLAB结构

addStructFields

MX阵列*

MATLAB阵列

MATLAB阵列

MX阵列**

MatlabArrayptor

lib.pointer对象

怎样MATLAB显示函数签名

以下是有关MATLAB函数签名中显示的输入和输出参数的注意事项。

  • 许多争论(比如int32双重的)与它们的C对应项类似。在这些情况下,传入为这些参数显示的MATLAB类型。

  • 一些C参数(例如,**双重的,或预定义结构),与标准MATLAB类型不同。在这些情况下,要么传递一个标准的MATLAB类型并让MATLAB为您转换它,要么使用MATLAB函数自己转换数据libstructlibpointer. 有关详细信息,请参阅手动转换传递给函数的数据.

  • C函数通常在通过引用传递的输入参数中返回数据。MATLAB创建额外的输出参数以返回这些值。输入参数以PtrPtrPtr也被列为输出。

有关MATLAB函数签名的示例,请参见共享库shribSample.

传递论点的准则

  • 非标量参数必须声明为在库函数中通过引用传递。

  • 如果库函数使用单下标索引来引用二维矩阵,请记住C程序逐行处理矩阵。MATLAB按列处理矩阵。要从函数中获得C行为,请在调用函数之前转置输入矩阵,然后转置函数输出。

  • 使用空数组,[],通过无效的支持可选输入参数的库函数的参数。仅当参数声明为万博1manbetxPtrPtrPtr如图所示libfunctionslibfunctionsview.

空指针

您可以创建一个无效的通过以下方式传递到库函数的指针:

  • 传递一个空数组[]作为论据。

  • 使用libpointer功能:

    p=libpointer;%无参数
    p=libpointer('string')%string参数
    p=libpointer('cstring')%指向字符串参数的指针
  • 使用libstruct功能:

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

空的libstruct对象

创建一个空的libstruct对象,呼叫libstruct只有结构类型参数。例如:

sci=libstruct(“c_结构”)获取(sci)
p1:0 p2:0 p3:0

MATLAB显示初始化值。

手动转换传递给函数的数据

在大多数情况下,MATLAB软件会自动将传入和传出外部库函数的数据转换为外部函数所需的类型。但是,您可以选择手动转换参数数据。例如:

  • 将相同的数据传递给一系列库函数时,在调用第一个函数之前手动转换一次,而不是让MATLAB在每次调用时自动转换。此策略减少了不必要的复制和转换操作的数量。

  • 当传递大型结构时,通过创建与函数中使用的C结构形状匹配的MATLAB结构来节省内存,而不是使用通用的MATLAB结构libstruct函数创建一个从库中获取的C结构建模的MATLAB结构。

  • 当外部函数的参数使用多个级别的引用时(例如,双重的**),传递使用libpointer函数,而不是依靠MATLAB自动转换类型。

另见

|||

相关实例

更多关于