Main Content

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

C 和等效的 MATLAB 类型

共享库接口支持所有标准标量 C 类型。下表显示了这些 C 类型及其等效的 MATLAB® 类型。对于具有左列中显示的 C 类型的参量,MATLAB 使用右列中的类型。

注意

MATLAB 返回的所有标量值都是 double 类型。

MATLAB 原始类型

C 类型等效的 MATLAB 类型

char, byte

int8

unsigned char, byte

uint8

short

int16

unsigned short

uint16

int

int32

long (Windows®)

int32,
long

long (Linux®)

int64,
long

unsigned int

uint32

unsigned long (Windows)

uint32,
long

unsigned long (Linux)

uint64,
long

float

single

double

double

char *

char 数组(1×n)

*char[]

字符向量元胞数组

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

MATLAB 扩展类型

C 指针类型参量
数据类型
等效的
MATLAB 类型

Shared Library shrlibsample
中的示例函数

double *

doublePtr

doubleaddDoubleRef

float *

singlePtr

single 

intsize *(整数指针类型)

(u)int(size)Ptr
例如,int64 * 变为 int64Ptr

(u)int(size)multiplyShort

byte[]

int8Ptr

int8 

char[](以空值结尾的传值字符串)

cstring

char 数组(1×n)

stringToUpper

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

stringPtrPtr

字符向量元胞数组

 
enum

enumPtr

  

type **

typePtrPtr
例如,double **
变为 doublePtrPtr

lib.pointer 对象

allocateStruct

void *

voidPtr

 deallocateStruct

void **

voidPtrPtr

lib.pointer 对象

 

struct(C 样式的结构体)

structure

MATLAB struct

addStructFields

mxArray *

MATLAB array

MATLAB 数组

 

mxArray **

MATLAB arrayPtr

lib.pointer 对象

 

MATLAB 如何显示函数签名

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

  • 许多参量(如 int32double)都与对应的 C 参量类似。在这些情况下,请传入针对这些参量所显示的 MATLAB 类型。

  • 某些 C 参量(例如 **double 或预定义的结构体)与标准 MATLAB 类型不同。在这些情况下,请传递标准 MATLAB 类型并让 MATLAB 来进行转换,或者您自己使用 MATLAB 函数 libstructlibpointer 转换数据。有关详细信息,请参阅手动转换传递给函数的数据

  • C 函数常通过按引用传递的输入参量来返回数据。MATLAB 创建其他输出参量以返回这些值。以 PtrPtrPtr 结尾的输入参量也列为输出。

有关 MATLAB 函数签名的示例,请参阅Shared Library shrlibsample

传递参量的指导原则

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

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

  • 使用空数组 []NULL 参数传递给支持可选输入参量的库函数。此表示法仅当参量声明为 PtrPtrPtr 时才有效,如 libfunctionslibfunctionsview 所示。

空指针

您可以通过以下方式创建 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 来自动转换类型。

另请参阅

| | |

相关示例

详细信息