外部库中的许多函数通过引用传递参数。当你通过引用传递时,你传递了一个指针的价值。在函数签名中,指针参数的名称以Ptr
和PtrPtr
.虽然是matlab.®不支持通过引用传递金宝app,您可以创建一个MATLAB参数,称为lib.pointerobject,它与C指针兼容。该对象是MATLAB的一个实例lib.pointer
类。
通常,您可以简单地传递一个MATLAB变量(按值传递参数),即使该函数的签名将参数声明为指针。然而,有些时候,传递信息是有用的lib.pointer
.
您想要修改输入参数中的数据。
您正在传递大量数据,并且希望控制MATLAB何时复制数据。
库存储和使用指针,因此您希望MATLAB函数控制的生命周期lib.pointer
对象。
C将字符表示为8位整数。要使用MATLAB字符数组作为输入参数,请将字符串转换为适当的类型并创建voidPtr
.例如:
str =字符串变量的;vp = libpointer(“voidPtr”[int8 (str) 0]);
的语法[int8 (str) 0]
创建C函数所需的以null结尾的字符串。要读取字符串并验证指针类型,请输入:
char (vp.Value)副总裁。数据类型
ans = string变量ans = voidPtr
当外部函数原型将实参定义为指针时,MATLAB自动将按值传递的实参转换为按引用传递的实参。调用一个接受voidPtr
将字符串作为输入参数,使用以下语法。
func_name([int8 (str) 0])
尽管MATLAB将实参从值转换为指针,但它必须是正确的类型。
通常,MATLAB在每次向库函数传递变量时都会传递一个有效的内存地址。使用一个lib.pointer
对象,用于库存储指针并随时间访问缓冲区的情况。在这些情况下,要确保MATLAB能够控制缓冲区的生命周期,并防止数据的复制。以下伪代码是一个异步数据获取的例子,显示了如何使用lib.pointer
在这种情况下。
假设一个外部库myLib
具有以下功能:
IsAquisitionDone(void) (int,short *buffer)
在哪里缓冲
声明如下:
短的缓冲[99]
首先,创建一个lib.pointer
变成一个99点的数组:
Buffersize = 99;pbuffer = libpointer('int16ptr',零(缓冲,1));
然后,开始获取数据,并在循环中等待,直到它完成:
calllib('myLib','AcquireData,BufferSize,pbuffer) while (~calllib('myLib','IsAcquisitionDone') pause(0.1) end
下面的语句读取缓冲区中的数据:
结果= pBuffer.Value;
当库处理完缓冲区后,清除MATLAB变量:
清晰的pbuf