传递指针示例
multDoubleRef 函数
shrlibsample 库中的 multDoubleRef 函数将输入乘以 5。
EXPORTED_FUNCTION double *multDoubleRef(double *x)
{
*x *= 5;
return x;
}输入是指向 double 的指针,而该函数也返回指向 double 的指针。MATLAB® 函数签名是:
| 返回类型 | 名称 | 参量 |
|---|---|---|
[lib.pointer, | multDoubleRef | (doublePtr) |
传递双精度类型的指针
此示例说明如何构造指针并传递给 C 函数 multDoubleRef。
加载包含该函数的库。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
构造指向输入参量 X 的指针 Xptr。
X = 13.3;
Xptr = libpointer('doublePtr',X);验证 Xptr 的内容。
get(Xptr)
Value: 13.3000
DataType: 'doublePtr'
调用该函数并检查结果。
calllib('shrlibsample','multDoubleRef',Xptr); Xptr.Value
ans = 66.5000
Xptr 是一个句柄对象。此句柄的副本引用同一个底层对象,对句柄对象执行的任何操作都影响该对象的所有副本。但是,Xptr 不是一个 C 语言指针。虽然它指向 X,但并不包含 X 的地址。该函数修改 Xptr 的 Value 属性,但不修改底层对象 X 中的值。X 的原始值保持不变。
X
X = 13.3000
从现有 lib.pointer 对象创建指针偏移
此示例说明如何创建指向 MATLAB 向量 X 的子集的指针。仅当原始指针存在时,新指针才有效。
创建指向向量的指针。
X = 1:10;
xp = libpointer('doublePtr',X);
xp.Valueans = 1×10
1 2 3 4 5 6 7 8 9 10
使用 lib.pointer 加号运算符 (+) 创建指向 X 的最后六个元素的指针。
xp2 = xp + 4; xp2.Value
ans = 1×6
5 6 7 8 9 10
多级指针
多级指针是指具有多级引用的参量。MATLAB 中的多级指针类型使用后缀 PtrPtr。例如,使用 doublePtrPtr 表示 C 参量 double **。
当调用接受多级指针参量的函数时,可以使用 lib.pointer 对象并让 MATLAB 将其转换为多级指针。
allocateStruct 和 deallocateStruct 函数
shrlibsample 库中的 allocateStruct 函数接受 c_structPtrPtr 参量。
EXPORTED_FUNCTION void allocateStruct(struct c_struct **val)
{
*val=(struct c_struct*) malloc(sizeof(struct c_struct));
(*val)->p1 = 12.4;
(*val)->p2 = 222;
(*val)->p3 = 333333;
}MATLAB 函数签名为:
| 返回类型 | 名称 | 参量 |
|---|---|---|
c_structPtrPtr | allocateStruct | (c_structPtrPtr) |
voidPtr | deallocateStruct | (voidPtr) |
传递多级指针
此示例说明如何将多级指针传递给 C 函数。
加载包含 allocateStruct 和 deallocateStruct 的库。
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
创建 c_structPtr 指针。
sp = libpointer('c_structPtr');调用 allocateStruct 以便为结构体分配内存。
res = calllib('shrlibsample','allocateStruct',sp)
res = struct with fields:
p1: 12.4000
p2: 222
p3: 333333
释放 allocateStruct 函数产生的内存。
calllib('shrlibsample','deallocateStruct',sp)
ans = libpointer
返回字符串数组
假设您有一个库 myLib,其中有一个函数 acquireString,它读取一个字符串数组。函数签名为:
| 返回类型 | 名称 | 参量 |
|---|---|---|
char** | acquireString | (void) |
char** acquireString(void)
以下伪代码说明如何操作返回值,即指向字符串的指针数组。
ptr = calllib(myLib,'acquireString')
MATLAB 创建 stringPtrPtr 类型的 lib.pointer 对象 ptr。此对象指向第一个字符串。要查看其他字符串,请递增指针。例如,要显示前三个字符串,请键入:
for index = 0:2
tempPtr = ptr + index;
tempPtr.Value
end ans =
'str1'
ans =
'str2'
ans =
'str3'