主要内容

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

C和MATLAB相同的类型

共享库接口支持所有标准标量C类型。金宝app下表显示了这些C类型和它们的等效MATLAB®类型。MATLAB使用来自右列的类型作为左列中显示的C类型的参数。

请注意

MATLAB返回的所有标量值都是type

MATLAB原始类型

C类型 相当于MATLAB类型

字符字节

int8

无符号字符字节

uint8

int16

无符号短

uint16

int

int32

(Windows®

int32

(Linux®

int64

无符号整型

uint32

无符号长(窗口)

uint32

无符号长(Linux)

uint64

浮动

char *

字符数组(1 xn)

* char []

字符向量的单元格数组

下表显示了MATLAB如何将C指针(列1)映射到等效MATLAB函数签名(列2)。通常,您可以将一个变量从等效MATLAB类型列传递到具有相应参数数据类型的函数。看到C函数中的指针参数查询何时使用a的信息lib.pointer对象。

MATLAB扩展的类型

C指针类型 论点
数据类型
等效
MATLAB类型

例子函数
共享库shrlibsample

双*

doublePtr

addDoubleRef

浮*

singlePtr

int大小(整数指针类型)

(u) int (大小) Ptr
例如,int64 *就变成了int64Ptr

(u) int (大小 multiplyShort

byte []

int8Ptr

int8

char [](由值传递的以null结尾的字符串)

装运箱

字符数组(1 xn)

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函数自己转换数据libstructlibpointer.有关更多信息,请参见手动转换传递给函数的数据

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

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

参数传递指南

  • 非标量参数必须在标准库函数中通过引用来声明。

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

  • 使用空数组,[]传递,传递支持可选输入参数的标准库函数的形参。金宝app只有当参数声明为PtrPtrPtr如图所示,libfunctionslibfunctionsview

空指针

您可以创建以下列方式传递给标准库函数的指针:

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

  • 使用libpointer功能:

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

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

libstruct对象

要创建空的libstruct对象,调用libstruct只有在structtype论点。例如:

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

MATLAB显示初始化的值。

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

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

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

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

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

另请参阅

|||

相关的例子

更多关于