coder.wref
指示要按引用传递的只写数据
说明
coder.wref(
表示 arg
)arg
是按引用传递给外部 C/C++ 函数的只写表达式或变量。仅在 coder.ceval
调用中使用 coder.wref
。此函数使代码生成器能够通过忽略您的 MATLAB® 代码中对 arg
的先前赋值来优化生成的代码,因为外部函数假定是不从数据中读取的。写入外部代码中 arg
的所有元素,以完全初始化内存。
注意
C/C++ 函数必须完全初始化 coder.wref(arg)
引用的内存。通过在 C/C++ 代码中为 arg
的每个元素赋值来初始化内存。如果生成的代码尝试从未初始化的内存中读取,可能导致未定义的运行时行为。
另请参阅 coder.ref
和 coder.rref
。
coder.wref(
指示 arg
,'gpu')arg
是 GPU 参量。此选项需要有效的 GPU Coder™ 许可证。如果 coder.ceval
调用 CUDA® GPU __device__
函数,代码生成器将忽略 'gpu'
设定。
示例
按引用将数组作为只写数组传递
假设您有一个 C 函数 init_array
。
void init_array(double* array, int numel) { for(int i = 0; i < numel; i++) { array[i] = 42; } }
C 函数将输入变量 array
定义为指向一个双精度数的指针。
调用 C 函数 init_array
以将 y
的所有元素初始化为 42:
... Y = zeros(5, 10); coder.ceval('init_array', coder.wref(Y), int32(numel(Y))); ...
将多个参量作为只写引用传递
... U = zeros(5, 10); V = zeros(5, 10); coder.ceval('my_fcn', coder.wref(U), int32(numel(U)), coder.wref(V), int32(numel(V))); ...
将类属性作为只写引用传递
... x = myClass; x.prop = 1; coder.ceval('foo', coder.wref(x.prop)); ...
将结构体作为只写引用传递
要指示结构体类型在 C 头文件中定义,请使用 coder.cstructname
。
假设有一个 C 函数 init_struct
。此函数写入但不读取输入参量。
#include "MyStruct.h" void init_struct(struct MyStruct *my_struct) { my_struct->f1 = 1; my_struct->f2 = 2; }
C 头文件 MyStruct.h
定义名为 MyStruct
的结构体类型:
#ifndef MYSTRUCT #define MYSTRUCT typedef struct MyStruct { double f1; double f2; } MyStruct; void init_struct(struct MyStruct *my_struct); #endif
在 MATLAB 函数中,将结构体作为只写引用传递给 init_struct
。使用 coder.cstructname
指示 s
的结构体类型具有在 C 头文件 MyStruct.h
中定义的名称 MyStruct
。
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','init_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); coder.ceval('init_struct', coder.wref(s));
要生成独立库代码,请输入:
codegen -config:lib foo -report
将结构体字段作为只写引用传递
... s = struct('s1', struct('a', [0 1])); coder.ceval('foo', coder.wref(s.s1.a)); ...
您也可以传递结构体数组的元素:
... c = repmat(struct('u',magic(2)),1,10); b = repmat(struct('c',c),3,6); a = struct('b',b); coder.ceval('foo', coder.wref(a.b(3,4).c(2).u)); ...
输入参数
限制
不能按引用传递以下数据类型:
类或 System object
元胞数组或元胞数组索引
如果某属性具有 get 方法、set 方法或验证器,或者是具有某些特性的 System object 属性,则您不能按引用将该属性传递给外部函数。请参阅Passing By Reference Not Supported for Some Properties。
提示
如果
arg
是数组,则coder.wref(arg)
提供数组第一个元素的地址。coder.wref(arg)
函数不包含有关数组大小的信息。如果 C 函数需要知道数据的元素数量,请将该信息作为单独的参量进行传递。例如:coder.ceval('myFun',coder.wref(arg),int32(numel(arg));
当您按引用向外部 C/C++ 函数传递结构体时,可以使用
coder.cstructname
提供在 C 头文件中定义的 C 结构体类型的名称。在 MATLAB 中,
coder.wref
会导致错误。要参数化您的 MATLAB 代码以使代码能够在 MATLAB 以及生成的代码中运行,请使用coder.target
。您可以使用
coder.opaque
来声明传递给外部 C/C++ 函数以及从该函数传回的变量。
扩展功能
版本历史记录
在 R2011a 中推出