coder.opaque
生成コード内の変数の宣言
構文
説明
y = coder.opaque(
は、生成コード内で type
)y
の変数宣言を指定した型で行い、初期値は指定しません。
y
には、変数または構造体フィールドを指定できます。MATLAB® コードは
y
に値を設定したりアクセスしたりすることはできませんが、外部 C 関数は、y
を引数として取ることができます。y
は以下になります。coder.rref
、coder.wref
またはcoder.ref
への引数coder.ceval
への入力または出力引数ユーザー作成の MATLAB 関数への入力または出力引数
コード生成用にサポートされる MATLAB ツールボックス関数のサブセットへの入力
y
からの代入により、生成コード内で同じ型をもつ他の変数を宣言します。以下に例を示します。これにより、生成コードにおいてy = coder.opaque('int'); z = y;
int
型をもつ変数z
が宣言されます。coder.opaque
を使用して宣言された変数、またはcoder.opaque
を使用して宣言された変数を代入した変数のいずれかをy
に代入することができます。これらの変数は同じ型でなければなりません。coder.opaque
を使用して宣言された変数、またはcoder.opaque
を使用して宣言された変数を代入した変数のいずれかと、y
を比較することができます。これらの変数は同じ型でなければなりません。
y = coder.opaque(___,'HeaderFile',
は型定義が含まれているヘッダー ファイルを指定します。コード ジェネレーターは、生成コードで必要とされるヘッダー ファイルの HeaderFile
)#include
ステートメントを生成します。ヘッダー ファイルの指定には、前の構文のいずれかを使用できます。
例
初期値が指定された変数の宣言
myfun
の呼び出しが成功したときに 1
を返す関数 valtest
のコードを生成します。この関数は、coder.opaque
を使用して、初期値 0
をもつ int
型変数 x1
を宣言します。x2 = x1
の代入を行うと、x1
と同じ型と初期値をもつ変数 x2
が宣言されます。
関数 valtest
を記述します。
function y = valtest %codegen %declare x1 to be an integer with initial value '0' x1 = coder.opaque('int','0'); %Declare x2 to have same type and initial value as x1 x2 = x1; x2 = coder.ceval('myfun'); %test the result of call to 'myfun' by comparing to value of x1 if x2 == x1 y = 0; else y = 1; end end
初期値とヘッダー ファイルが指定された変数の宣言
fopen/fread/fclose
を使用して独自のソース コードを返す MATLAB 関数 filetest
のコードを生成します。この関数は、coder.opaque
を使用して、 fopen/fread/fclose
で使われるファイル ポインターを格納する変数を宣言します。coder.opaque
の呼び出しにより、初期値 NULL
、ヘッダー ファイル <stdio.h>
をもつ FILE *
型変数 f
が宣言されます。
MATLAB 関数 filetest
を記述します。
function buffer = filetest %#codegen % Declare 'f' as an opaque type 'FILE *' with initial value 'NULL" %Specify the header file that contains the type definition of 'FILE *'; f = coder.opaque('FILE *', 'NULL','HeaderFile','<stdio.h>'); % Open file in binary mode f = coder.ceval('fopen', cstring('filetest.m'), cstring('rb')); % Read from file until end of file is reached and put % contents into buffer n = int32(1); i = int32(1); buffer = char(zeros(1,8192)); while n > 0 % By default, MATLAB converts constant values % to doubles in generated code % so explicit type conversion to int32 is inserted. n = coder.ceval('fread', coder.ref(buffer(i)), int32(1), ... int32(numel(buffer)), f); i = i + n; end coder.ceval('fclose',f); buffer = strip_cr(buffer); % Put a C termination character '\0' at the end of MATLAB character vector function y = cstring(x) y = [x char(0)]; % Remove all character 13 (CR) but keep character 10 (LF) function buffer = strip_cr(buffer) j = 1; for i = 1:numel(buffer) if buffer(i) ~= char(13) buffer(j) = buffer(i); j = j + 1; end end buffer(i) = 0;
coder.opaque
で宣言された変数の比較
ファイルのオープンに成功したかどうかをテストするために、coder.opaque
で宣言された変数を比較します。
coder.opaque
を使用して、初期値 NULL
をもつ FILE *
型変数 null
を宣言します。
null = coder.opaque('FILE *', 'NULL', 'HeaderFile', '<stdio.h>');
代入により、null
と同じ型と値をもつ別の変数 ftmp
を宣言します。
ftmp = null; ftmp = coder.ceval('fopen', ['testfile.txt', char(0)], ['r', char(0)]);
変数の比較
if ftmp == null %error condition end
coder.opaque
を使用して宣言した変数の型とのキャスト
この例では、coder.opaque
を使用して宣言されている変数の型へのキャストと型からのキャストを行う方法を示します。関数 castopaque
は C の実行時関数 strncmp
を呼び出して、文字列 s1
および s2
の最大 n
個の文字を比較します。n
は短い方の文字列の文字数です。strncmp
の入力 nsizet
として正しい C の型を生成するために、関数は n
を C の型 size_t
にキャストして、その結果を nsizet
に割り当てます。関数は coder.opaque
を使用して nsizet
を宣言します。出力 retval
を strncmp
から使用する前に、関数は retval
を MATLAB の型 int32
にキャストして、その結果を y
に保存します。
次の MATLAB 関数を書き込みます。
function y = castopaque(s1,s2) % <0 - the first character that does not match has a lower value in s1 than in s2 % 0 - the contents of both strings are equal % >0 - the first character that does not match has a greater value in s1 than in s2 % %#codegen coder.cinclude('<string.h>'); n = min(numel(s1), numel(s2)); % Convert the number of characters to compare to a size_t nsizet = cast(n,'like',coder.opaque('size_t','0')); % The return value is an int retval = coder.opaque('int'); retval = coder.ceval('strncmp', cstr(s1), cstr(s2), nsizet); % Convert the opaque return value to a MATLAB value y = cast(retval, 'int32'); %-------------- function sc = cstr(s) % NULL terminate a MATLAB character vector for C sc = [s, char(0)];
MEX 関数を生成します。
codegen castopaque -args {blanks(3), blanks(3)} -report
入力 'abc'
および 'abc'
を指定して MEX 関数を呼び出します。
castopaque_mex('abc','abc')
ans = 0
文字列が等しいため、出力は 0
になります。
入力 'abc'
および 'abd'
を指定して MEX 関数を呼び出します。
castopaque_mex('abc','abd')
ans = -1
2 番目の文字列の 3 番目の文字 d
が最初の文字列の 3 番目の文字 c
より大きいため、出力は -1
になります。
入力 'abd'
および 'abc'
を指定して MEX 関数を呼び出します。
castopaque_mex('abd','abc')
ans = 1
最初の文字列の 3 番目の文字 d
が 2 番目の文字列の 3 番目の文字 c
より大きいため、出力は 1
になります。
MATLAB ワークスペースでは、y
の型は int32
であると確認できます。
初期値とサイズが指定された変数の宣言
y
を初期値 0 の 4 バイト整数として宣言します。
y = coder.opaque('int','0', 'Size', 4);
入力引数
ヒント
type
で指定される型をもつvalue
を指定します。それ以外の場合、生成されたコードから予期しない結果が生じる可能性があります。たとえば、次のcoder.opaque
宣言により予期しない結果が生じる場合があります。y = coder.opaque('int', '0.2')
関数
coder.opaque
は、変数の型を宣言します。変数のインスタンスは作成しません。後で、MATLAB コードでこの関数を使用して、変数のインスタンスを作成することができます。以下の例では、関数coder.ceval
からfp1
に代入することで、fp1
のインスタンスが作成されます。% Declare fp1 of type FILE * fp1 = coder.opaque('FILE *'); %Create the variable fp1 fp1 = coder.ceval('fopen', ['testfile.txt', char(0)], ['r', char(0)]);
MATLAB 環境では、
coder.opaque
はvalue
で指定された値を返します。value
を指定しない場合、空の文字ベクトルが返されます。coder.opaque
を使用して宣言された変数またはcoder.opaque
を使用して宣言された変数から値を代入された変数を比較することができます。これらの変数は同じ型でなければなりません。以下に、これらの変数を比較する例を示します。 coder.opaque で宣言された変数の比較生成コードで同じヘッダー ファイルが何度もインクルードされるのを防ぐには、条件付きプリプロセッサ命令
#ifndef
および#endif
でヘッダー ファイルを囲みます。次に例を示します。#ifndef MyHeader_h #define MyHeader_h <body of header file> #endif
MATLAB の関数
cast
を使用して、変数をcoder.opaque
を使用して宣言されている変数にキャストするか、この変数からキャストします。数値型の場合のみcoder.opaque
を指定してcast
を使用します。coder.opaque
によって宣言された変数を MATLAB の型にキャストするために、B = cast(A,type)
構文を使用できます。次に例を示します。x = coder.opaque('size_t','0'); x1 = cast(x, 'int32');
B = cast(A,'like',p)
構文を使うこともできます。次に例を示します。x = coder.opaque('size_t','0'); x1 = cast(x, 'like', int32(0));
coder.opaque
によって宣言された変数の型に MATLAB 変数をキャストするには、B = cast(A,'like',p)
構文を使用しなければなりません。次に例を示します。x = int32(12); x1 = coder.opaque('size_t', '0'); x2 = cast(x, 'like', x1));
以下について、正しいデータ型を生成するには
coder.opaque
を指定してcast
を使用します。coder.ceval
を使用して呼び出す C/C++ 関数への入力。coder.ceval
を使用して呼び出す C/C++ 関数からの出力に割り当てられる変数。
このキャストを行わなくても、コード生成中にコンパイラの警告が表示されることがあります。
拡張機能
バージョン履歴
R2011a で導入