Main Content

在 C 共享库函数中表示指针参量

C 函数中的指针参量

外部库中的许多函数按引用传递参量。当按引用传递参数时,传递的是值的指针。在函数签名中,指针参量的名称以 PtrPtrPtr 结尾。尽管 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

另请参阅