Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

coder.rref

参照渡しする読み取り専用データを示す

説明

coder.rref (arg)は、argが外部 C/C++ 関数に参照渡しする読み取り専用の式または変数であることを示します。coder.rrefcoder.ceval呼び出し内でのみ使用します。

関数coder.rrefにより、コード ジェネレーターで生成コードを最適化できます。外部関数はcoder.rref (arg)に書き込まないものと想定されているため、コード ジェネレーターはcoder.cevalの呼び出しの前後に発生するargへの代入で式の畳み込みなどの最適化を実行できます。式の畳み込みは、複数の演算を 1 つのステートメントに結合して、一時変数の使用を避け、コードのパフォーマンスを向上させます。

メモ

コード ジェネレーターでは、coder.rref (arg)で渡すメモリが読み取り専用であることを前提にします。予測できない結果を回避するために、C/C++ 関数でこの変数への書き込みを行ってはなりません。

coder.refcoder.wrefも参照してください。

読み取り専用としてのスカラー変数の参照渡し

定数入力に 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.hMyStructという名前の構造体型を定義します。

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

MATLAB®関数で、構造体を読み取り専用の参照としてuse_structに渡します。sの構造体型に C ヘッダー ファイルMyStruct.hで定義された名前MyStructが付いていることを示すには、coder.cstructnameを使用します。

functiony = foo%#codegeny = 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:libfoo-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);一个=结构('b',b); coder.ceval('foo', coder.rref(a.b(3,4).c(2).u));...

入力引数

すべて折りたたむ

外部 C/C++ 関数に参照渡しする引数。引数をクラス、System object™、cell 配列、cell 配列へのインデックスにすることはできません。

データ型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64|logical|char|struct
複素数のサポート:あり

制限

  • 次のデータ型を参照で渡すことはできません。

    • クラスまたは 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 で導入