主要内容

Coder.Rref.

指示通过引用传递的只读数据

描述

coder.rref(arg表明arg是一个只读表达式或变量,通过引用传递给外部C/ c++函数。使用Coder.Rref.只有在A内coder.ceval呼叫。

Coder.Rref.功能可以使代码生成器能够优化生成的代码。因为外部函数被假定不写信coder.rref (arg),代码生成器可以在赋值时执行表达式折叠等优化arg发生在之前和之后coder.ceval呼叫。表达式折叠是将多个操作的组合成一个语句,以避免使用临时变量并提高代码性能。

注意

代码生成器假设您传递的内存coder.rref (arg)是只读的。为了避免不可预知的结果,C/ c++函数不能写入这个变量。

也可以看看编码器.REF.编码器.Wref.

例子

将标量变量传递为只读引用

考虑c函数adjone.返回一个常量输入加1的值:

双addone(const double * p){return * p + 1;}

C函数定义输入变量P.作为指向常量double的指针。

通过引用传递输入adjone.

......y = 0;u = 42;y = coder.ceval('附加',coder.rref(u));......

将多个参数传递为只读引用

......U = 1;v = 2;y = coder.ceval('my_fcn',coder.rref(u),coder.rref(v));......

将类属性作为只读引用传递

......x = myClass;x.prop = 1;y = coder.ceval('foo'coder.rref (x.prop));......

将结构作为只读参考

表示结构类型在C头文件中定义,使用coder.cstructname

假设你有C函数use_struct。此函数从输入参数中读取,但不会写入它。

#include“mystruct.h”double divult_struct(const struct mystruct * my_struct){return my_struct-> f1 + my_struct-> f2;}

c头文件,MyStruct.h,定义名为mystruct.

#ifndef MYSTRUCT #define MYSTRUCT typedef struct MYSTRUCT {double f1;双f2;} MyStruct;const struct my_struct *my_struct;# endif

在你的matlab中®功能,将结构传递为只读引用use_struct。表示结构类型S.有名字mystruct.它在C头文件中定义MyStruct.h,使用coder.cstructname

函数y = foo%#codegen.y = 0;Coder.updateBuildInfo(“addSourceFiles”'use_struct.c');s = struct('f1',1,“f2”,2);编码器.cstructName(s,'mystrict'“外来的”'头球文件''mystruct.h');y = coder.ceval('use_struct',编码器.rref(s));

要生成独立库代码,输入:

Codegen.配置:自由Foo-报告

将结构字段传递为只读参考

......s = struct('s1',struct('一个',[0 1]));y = coder.ceval('foo'coder.rref (s.s1.a));......

你也可以传递一个结构数组的元素:

......c = repmat(结构('U'魔法(2)1 10);b = repmat(结构体('C',c),3,6);a = struct('B',b);Coder.CEVAL('foo',编码器.RREF(A.B(3,4).c(2).u));......

输入参数

全部收缩

通过引用通过引用外部C / C ++函数来传递参数。该参数不能是类,系统对象™,一个小区数组或索引到单元格数组中。

数据类型:||INT8.|int16|INT32.|INT64.|uint8.|uint16|UINT32|UINT64|逻辑|char|塑造
复数支持:万博1manbetx

限制

  • 你不能通过引用传递这些数据类型:

    • 类或系统对象

    • 单元格数组或索引到单元阵列中

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的系统对象属性,那么您就不能通过引用将属性传递给外部函数。看到通过引用不支持某些属性万博1manbetx

提示

  • 如果arg是一个数组,然后是coder.rref (arg)提供数组的第一个元素的地址。该coder.rref (arg)函数不包含有关数组大小的信息。如果C函数必须知道数据的元素数,请将该信息作为单独的参数传递。例如:

    Coder.CEVAL('myfun',coder.rref(arg),int32(numel(arg));
  • 通过引用外部C / C ++功能通过结构,使用coder.cstructname提供在C头文件中定义的C结构类型的名称。

  • 在matlab,Coder.Rref.导致错误。参加MATLAB代码,以便它可以在MATLAB和生成的代码中运行,使用编码器.Target.

  • 您可以使用coder.opaque声明传递给外部C/ c++函数和从外部C/ c++函数传递的变量。

在R2011A介绍