ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

coder.wref

参照渡しする書き込み専用データを示す

説明

coder.wref(arg) は、arg が外部 C/C++ 関数に参照渡しする書き込み専用の式または変数であることを示します。coder.wrefcoder.ceval 呼び出し内でのみ使用します。外部関数はデータから読み取らないものと想定されているため、この関数により、コード ジェネレーターは MATLAB® コードで arg への前の代入を無視することで、生成されたコードを最適化できます。外部コードで arg のすべての要素に書き込み、メモリを完全に初期化します。

メモ

C/C++ 関数は coder.wref(arg) で参照されるメモリを完全に初期化しなければなりません。C/C++ コードで arg のすべての要素に値を代入してメモリを初期化します。生成コードが未初期化メモリから読み取ろうとする場合、未定義の実行時動作を引き起こす可能性があります。

coder.ref および coder.rref も参照してください。

書き込み専用としての配列の参照渡し

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

#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));
...

入力引数

すべて折りたたむ

外部 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.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 で導入