coder.wref
参照渡しする書き込み専用データを示す
説明
coder.wref(
は、arg
)arg
が外部 C/C++ 関数に参照渡しする書き込み専用の式または変数であることを示します。coder.wref
は coder.ceval
呼び出し内でのみ使用します。外部関数はデータから読み取らないものと想定されているため、この関数により、コード ジェネレーターは 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
を double へのポインターとして定義します。
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
で定義された名前 MyStruct.h
が付いていることを示します。
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
cell 配列または cell 配列へのインデックス
プロパティに get メソッド、set メソッド、または検証関数がある場合、またはプロパティが特定の属性をもつ System object プロパティである場合、そのプロパティを外部関数に参照で渡すことはできません。一部のプロパティでサポートされない参照渡しを参照してください。
ヒント
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 で導入