coder.rref
参照渡しする読み取り専用データを示す
説明
coder.rref( は、arg)arg が外部 C/C++ 関数に参照渡しする読み取り専用の式または変数であることを示します。coder.rref は coder.ceval 呼び出し内でのみ使用します。
関数 coder.rref により、コード ジェネレーターで生成コードを最適化できます。外部関数は coder.rref(arg) に書き込まないものと想定されているため、コード ジェネレーターは coder.ceval の呼び出しの前後に発生する arg への代入で式の畳み込みなどの最適化を実行できます。式の畳み込みは、複数の演算を 1 つのステートメントに結合して、一時変数の使用を避け、コードのパフォーマンスを向上させます。
メモ
コード ジェネレーターでは、coder.rref(arg) で渡すメモリが読み取り専用であることを前提にします。予測できない結果を回避するために、C/C++ 関数でこの変数への書き込みを行ってはなりません。
coder.ref と coder.wref も参照してください。
coder.rref( は、arg,'gpu')arg が GPU の引数であることを示します。このオプションには有効な GPU Coder™ ライセンスが必要です。coder.ceval で CUDA® の GPU 関数 __device__ を呼び出す場合、'gpu' の指定はコード ジェネレーターで無視されます。
例
読み取り専用としてのスカラー変数の参照渡し
定数入力に 1 を加算した値を返す C 関数 addone について考えます。
double addone(const double* p) {
return *p + 1;
}C 関数は入力変数 p を定数 double へのポインターとして定義します。
入力を addone へ参照渡しします。
... y = 0; u = 42; y = coder.ceval('addone', 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 use_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;
double f2;
} MyStruct;
double use_struct(const struct MyStruct *my_struct);
#endifMATLAB® 関数で、構造体を読み取り専用の参照として use_struct に渡します。s の構造体型に C ヘッダー ファイル MyStruct.h で定義された名前 MyStruct が付いていることを示すには、coder.cstructname を使用します。
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','use_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); y = coder.ceval('use_struct', coder.rref(s));
スタンドアロンのライブラリ コードを生成するには、以下を入力します。
codegen -config:lib foo -report
読み取り専用としての構造体フィールドの参照渡し
... s = struct('s1', struct('a', [0 1])); y = coder.ceval('foo', coder.rref(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.rref(a.b(3,4).c(2).u)); ...
入力引数
制限
次のデータ型を参照で渡すことはできません。
クラスまたは System object
cell 配列または cell 配列へのインデックス
プロパティに get メソッド、set メソッド、または検証関数がある場合、またはプロパティが特定の属性をもつ System object プロパティである場合、そのプロパティを外部関数に参照で渡すことはできません。一部のプロパティでサポートされない参照渡しを参照してください。
ヒント
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 と生成されたコード内で実行できるようにするには、coder.targetを使用します。coder.opaqueを使用して、外部 C/C++ 関数との間で受け渡す変数を宣言できます。
拡張機能
バージョン履歴
R2011a で導入