主要内容

指针参数

C函数中的指针参数

外部库中的许多函数通过引用传递参数。当你通过引用传递时,你传递了一个指针的价值。在函数签名中,指针参数的名称以PtrPtrPtr.虽然是matlab.®不支持通过引用传递金宝app,您可以创建一个MATLAB参数,称为lib.pointerobject,它与C指针兼容。该对象是MATLAB的一个实例lib.pointer类。

通常,您可以简单地传递一个MATLAB变量(按值传递参数),即使该函数的签名将参数声明为指针。然而,有些时候,传递信息是有用的lib.pointer

  • 您想要修改输入参数中的数据。

  • 您正在传递大量数据,并且希望控制MATLAB何时复制数据。

  • 库存储和使用指针,因此您希望MATLAB函数控制的生命周期lib.pointer对象。

将字符串放入Void指针中

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

另请参阅