主要内容

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

C函数中的指针参数

外部库中的许多功能通过参考通过参数。当您通过参考时,您通过了指针值。在函数签名中,指针参数的名称结尾ptrandptrptr。Although MATLAB®不支持通过引用传递金宝app,您可以创建一个称为a的matlab参数lib.pointerobject,这与C指针兼容。此对象是MATLAB的实例lib.pointer班级。

通常,即使该函数的签名声明该参数为指针,您也可以简单地传递MATLAB变量(按值传递)。但是,有时候通过lib.pointer

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

  • You are passing large amounts of data, and you want to control when MATLAB makes copies of the data.

  • 图书馆存储并使用指针,因此您希望MATLAB功能控制该寿命lib.pointerobject.

将字符串放入空隙指针中

C代表人物8位整数。使用a MATLAB character array as an input argument, convert the string to the proper type and create avoidPtr。例如:

str =“字符串变量”; vp = libpointer('voidptr',[int8(str)0]);

语法[int8(str)0]创建C函数所需的零终止字符串。要读取字符串并验证指针类型,请输入:

char(vp.value)vp.datatype
ans =字符串变量ans = voidptr

MATLAB会自动将按值传递的参数转换为当外部函数原型将参数定义为指针时通过引用传递的参数。调用采用一个功能voidPtr使用以下语法将字符串作为输入参数。

func_name([int8(str)0])

尽管MATLAB将参数从值转换为指针,但必须是正确的类型。

外部库的内存分配

通常,MATLAB每次将变量传递给库函数时都会传递有效的内存地址。用一个lib.pointer如果库存储指针并随着时间的推移访问缓冲区的对象。在这些情况下,确保MATLAB可以控制缓冲区的寿命,并防止数据的副本。以下伪代码是异步数据采集的一个示例,该示例显示了如何使用lib.pointer在这个情况下。

Suppose an external librarymylib具有以下功能:

Acquiredata(int点,短 *缓冲区)等依然done(void)

在哪里缓冲声明如下:

短缓冲区[99]

首先,创建一个lib.pointer达到99分的数组:

BufferSize = 99; pBuffer = libpointer('int16Ptr',zeros(BufferSize,1));

然后,开始获取数据并等待循环直至完成:

calllib('mylib','akepiredata,bufferSize,pbuffer)while(〜calllib('mylib','isacquicitiondone')暂停(0.1)结束

以下语句在缓冲区中读取数据:

结果= pbuffer.value;

使用缓冲区完成库后,清除MATLAB变量:

clear pBuffer

也可以看看