本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

指针参数

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

另请参阅