指示通过引用传递的只读数据
coder.rref (
表明参数
)参数
是通过引用传递给外部C/ c++函数的只读表达式或变量。使用coder.rref
只有在coder.ceval
调用。
的coder.rref
函数可以使代码生成器优化生成的代码。因为外部函数假设不写入coder.rref (arg)
,代码生成器可以执行优化,例如对赋值的表达式折叠参数
发生在coder.ceval
调用。表达式折叠是将多个操作组合到一条语句中,以避免使用临时变量并提高代码性能。
请注意
代码生成器假定您传递的内存coder.rref (arg)
是只读的。为了避免不可预知的结果,C/ c++函数不能写入此变量。
另请参阅coder.ref
而且coder.wref
.
考虑C函数addone
它返回常量输入的值加1:
Double addone(const Double *p){返回*p + 1;}
C函数定义输入变量p
作为指向常量双精度的指针。
通过引用传递输入addone
:
...Y = 0;U = 42;Y = code .ceval(“addone”, coder.rref (u));...
...U = 1;V = 2;Y = code .ceval(“my_fcn”, code .rref(u), code .rref(v));...
...x = myClass;X.prop = 1;Y = code .ceval(“foo”coder.rref (x.prop));...
要指示结构类型是在C头文件中定义的,请使用coder.cstructname
.
假设你有一个C函数use_struct
.这个函数从输入参数中读取,但不写入。
#include "MyStruct.h" double use_struct(const struct MyStruct *my_struct) {return my_struct->f1 + my_struct->f2;}
C头文件,MyStruct.h
,定义名为MyStruct
:
#定义MYSTRUCT类型定义MYSTRUCT MYSTRUCT {double f1;双f2;} MyStruct;(const struct MyStruct *my_struct);# endif
在你的MATLAB中®函数时,将结构作为只读引用传递给use_struct
.的结构类型年代
有名字MyStruct
在C头文件中定义MyStruct.h
,使用coder.cstructname
.
函数Y = foo% # codegenY = 0;coder.updateBuildInfo (“addSourceFiles”,“use_struct.c”);S = struct(“f1”, 1“f2”2);coder.cstructname(年代,“MyStruct”,“外来的”,“HeaderFile”,“MyStruct.h”);Y = code .ceval(“use_struct”coder.rref (s));
要生成独立库代码,输入:
codegen配置:自由喷火报告
...S = struct(“s1 '结构(“一个”, [0 1]);Y = code .ceval(“foo”coder.rref (s.s1.a));...
你也可以传递一个结构数组的元素:
...C = repmat(struct)“u”魔法(2)1 10);B = repmat(struct)“c”c) 3、6);A = struct(“b”, b);coder.ceval (“foo”coder.rref (a.b (3, 4) . c (2) .u));...
不能通过引用传递这些数据类型:
类或系统对象
单元格数组或索引到单元格数组
如果属性具有get方法、set方法或验证器,或者是具有某些属性的System对象属性,则不能通过引用将该属性传递给外部函数。看到某些属性不支持传递引用金宝app.
如果参数
是数组吗coder.rref (arg)
提供数组的第一个元素的地址。的coder.rref (arg)
函数不包含关于数组大小的信息。如果C函数必须知道数据的元素数量,则将该信息作为单独的参数传递。例如:
coder.ceval (“myFun”coder.rref (arg)、int32(元素个数(arg));
当通过引用外部C/ c++函数传递结构时,使用coder.cstructname
提供在C头文件中定义的C结构类型的名称。
在MATLAB中,coder.rref
导致错误。要参数化您的MATLAB代码,以便它可以在MATLAB和生成的代码中运行,请使用coder.target
.
你可以用coder.opaque
来声明传递给或来自外部C/ c++函数的变量。