在 C 共享库函数中表示指针参量
C 函数中的指针参量
外部库中的许多函数按引用传递参量。当按引用传递参数时,传递的是值的指针。在函数签名中,指针参量的名称以 Ptr
和 PtrPtr
结尾。尽管 MATLAB® 不支持按引用传递参量,但您可以创建一个称为 lib.pointer 对象并且与 C 指针兼容的 MATLAB 参量。该对象是 MATLAB lib.pointer
类的实例。
通常,您只需要传递 MATLAB 变量(传值参量)即可,即使该函数的签名声明参量为指针时亦如此。但有时传递 lib.pointer
非常有用。
需要修改输入参量中的数据。
正在传递大量数据,并且需要控制 MATLAB 复制数据的时间。
库将存储和使用指针,因此,您希望 MATLAB 函数控制
lib.pointer
对象的生存时间。
将字符串置入 Void 指针
C 将字符表示为 8 位整数。要将 MATLAB 字符数组用作输入参量,请将字符串转换为适当的类型并创建一个 voidPtr
。例如:
str = 'string variable'; vp = libpointer('voidPtr',[int8(str) 0]);
语法 [int8(str) 0]
会创建 C 函数所需的以空值结尾的字符串。要读取该字符串并验证指针类型,请输入:
char(vp.Value) vp.DataType
ans = string variable ans = voidPtr
当外部函数原型将参量定义为指针时,MATLAB 会自动将传值参量转换为传引用参量。使用以下语法可调用一个将指向字符串的 voidPtr
作为输入参量的函数。
func_name([int8(str) 0])
尽管 MATLAB 会将该参量从值转换为指针,但它必须是正确的类型。
外部库的内存分配
一般而言,MATLAB 会在您每次将变量传递到库函数时传递一个有效的内存地址。如果库存储指针并在一段时间内访问缓冲区,则使用 lib.pointer
对象。在这类情况下,请确保 MATLAB 能够控制缓冲区的生存时间,并防止创建多个数据副本。以下伪代码是一个异步数据采集的示例,其中显示了在这种情形下如何使用 lib.pointer
。
假设外部库 myLib
具有以下函数:
AcquireData(int points,short *buffer) IsAquisitionDone(void)
其中,buffer
的声明如下:
short buffer[99]
首先,创建一个 lib.pointer
,指向包含 99 个点的数组:
BufferSize = 99; pBuffer = libpointer('int16Ptr',zeros(BufferSize,1));
然后,开始采集数据并在循环中等待,直至完成数据采集:
calllib('myLib','AcquireData,BufferSize,pbuffer) while (~calllib('myLib','IsAcquisitionDone') pause(0.1) end
以下语句将读取缓冲区中的数据:
result = pBuffer.Value;
当库完成缓冲区操作后,清除 MATLAB 变量:
clear pBuffer