将参量传递给共享的 C 库函数
C 和等效的 MATLAB 类型
共享库接口支持所有标准标量 C 类型。下表显示了这些 C 类型及其等效的 MATLAB® 类型。对于具有左列中显示的 C 类型的参量,MATLAB 使用右列中的类型。
注意
MATLAB 返回的所有标量值都是 double
类型。
MATLAB 原始类型
C 类型 | 等效的 MATLAB 类型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned long (Windows) |
|
unsigned long (Linux) |
|
|
|
|
|
|
|
| 字符向量元胞数组 |
下表显示 MATLAB 如何将 C 指针(第 1 列)映射到等效的 MATLAB 函数签名(第 2 列)。通常,您可以将等效的 MATLAB 类型列中的变量传递给具有相应参量数据类型的函数。有关何时改用 lib.pointer
对象的信息,请参阅 C 函数中的指针参量。
MATLAB 扩展类型
C 指针类型 | 参量 数据类型 | 等效的 MATLAB 类型 | Shared Library shrlibsample |
---|---|---|---|
|
| double | addDoubleRef |
|
| single | |
|
| (u)int( | multiplyShort |
|
| int8 | |
|
|
| stringToUpper |
|
| 字符向量元胞数组 | |
enum |
| ||
|
|
| allocateStruct |
|
| deallocateStruct | |
|
|
| |
| structure | MATLAB | addStructFields |
|
| MATLAB 数组 | |
|
|
|
MATLAB 如何显示函数签名
以下是有关 MATLAB 函数签名中显示的输入和输出参量的注意事项。
许多参量(如
int32
和double
)都与对应的 C 参量类似。在这些情况下,请传入针对这些参量所显示的 MATLAB 类型。某些 C 参量(例如
**double
或预定义的结构体)与标准 MATLAB 类型不同。在这些情况下,请传递标准 MATLAB 类型并让 MATLAB 来进行转换,或者您自己使用 MATLAB 函数libstruct
和libpointer
转换数据。有关详细信息,请参阅手动转换传递给函数的数据。C 函数常通过按引用传递的输入参量来返回数据。MATLAB 创建其他输出参量以返回这些值。以
Ptr
或PtrPtr
结尾的输入参量也列为输出。
有关 MATLAB 函数签名的示例,请参阅Shared Library shrlibsample。
传递参量的指导原则
非标量参量必须在库函数中声明为传引用。
如果库函数使用单下标索引来引用二维矩阵,请记住,C 程序会逐行处理矩阵;MATLAB 按列处理矩阵。要从函数中获取 C 行为,请在调用函数之前转置输入矩阵,然后转置函数输出。
使用空数组
[]
将NULL
参数传递给支持可选输入参量的库函数。此表示法仅当参量声明为Ptr
或PtrPtr
时才有效,如libfunctions
或libfunctionsview
所示。
空指针
您可以通过以下方式创建 NULL
指针以传递给库函数:
传递空数组
[]
作为参量。使用
libpointer
函数:p = libpointer; % no arguments
p = libpointer('string') % string argument
p = libpointer('cstring') % pointer to a string argument
使用
libstruct
函数:p = libstruct('structtype'); % structure type
空 libstruct
对象
要创建空 libstruct
对象,请仅使用 structtype
参量调用 libstruct
。例如:
sci = libstruct('c_struct')
get(sci)
p1: 0 p2: 0 p3: 0
MATLAB 显示初始化后的值。
手动转换传递给函数的数据
在大多数情况下,MATLAB 软件会自动将传入和传出外部库函数的数据转换为外部函数期望的类型。不过,您也可以选择手动转换参量数据。例如:
将相同数据传递给一系列库函数时,请在调用第一个函数之前手动进行一次转换,而不是在每次调用时都让 MATLAB 自动转换它。该策略可以减少不必要的复制和转换操作次数。
在传递大型结构体时,通过创建与函数中使用的 C 结构体形状匹配的 MATLAB 结构体(而不是使用一般 MATLAB 结构体)来节省内存。
libstruct
函数以从库中获取的 C 结构体为模型创建 MATLAB 结构体。如果外部函数的参量使用多个引用级别(例如
double **
),则请传递使用libpointer
函数创建的指针,而不是依赖 MATLAB 来自动转换类型。
另请参阅
libstruct
| libpointer
| libfunctions
| libfunctionsview