ドキュメンテーション

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

coder.opaque

生成コード内の変数の宣言

構文

  • y = coder.opaque(type)
  • y = coder.opaque(type,value)
  • y = coder.opaque(type,'HeaderFile',HeaderFile)
  • y = coder.opaque(type,value,'HeaderFile',HeaderFile)

説明

y = coder.opaque(type) は、生成コード内で y の変数宣言を指定した型で行い、初期値は指定しません。

  • y には、変数または構造体フィールドを指定できます。

  • MATLAB® コードは y に値を設定したりアクセスしたりすることはできませんが、外部 C 関数は、 y を引数として取ることができます。

  • y は以下になります。

    • coder.rrefcoder.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(type,value) は、生成コードにおいて、変数 y を宣言し、y の初期値を指定します。

y = coder.opaque(type,'HeaderFile',HeaderFile) は、y を宣言し、type の定義を含むヘッダー ファイルを指定します。コード生成ソフトウェアは、生成コードでヘッダー ファイルが必要とされる場所で、そのヘッダー ファイルの #include ステートメントを生成します。

y = coder.opaque(type,value,'HeaderFile',HeaderFile) は、型、初期値、生成コードのヘッダー ファイルを指定して変数 y を宣言します。

すべて折りたたむ

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 intial 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

スタティック ライブラリ用のコード生成構成オブジェクトを作成します。

cfg = coder.config('lib');

valtest のスタティック ライブラリを生成します。

codegen -report -config cfg valtest

codegen によって C コードが codegen\lib\valtest フォルダー内に生成されます。

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 intial 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 string
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;

スタティック ライブラリ用のコード生成構成オブジェクトを作成します。

cfg = coder.config('lib');

filetest のスタティック ライブラリを生成します。

codegen -report -config cfg filetest

codegen によって C コードが codegen\lib\filetest フォルダー内に生成されます。

ファイルのオープンに成功したかどうかをテストするために、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 を使用して宣言されている変数の型へのキャストと型からのキャストを行う方法を示します。関数 castopaque は C の実行時関数 strncmp を呼び出して、文字列 s1 および s2 の最大 n 個の文字を比較します。n は短い方の文字列の文字数です。strncmp の入力 nsizet として正しい C の型を生成するために、関数は n を C の型 size_t にキャストして、その結果を nsizet に割り当てます。関数は coder.opaque を使用して nsizet を宣言します。出力 retvalstrncmp から使用する前に、関数は 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 string 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 であると確認できます。

入力引数

すべて折りたたむ

文字列定数として指定された生成コードにおける変数の型この型は、以下のいずれかでなければなりません。

  • C の組み込みデータ型またはヘッダー ファイルで定義された型

  • 代入にるコピーをサポートする C の型

  • C の宣言で使用可能な接頭辞

例: 'FILE *'

データ型: char

文字列定数として指定された生成コードにおける変数の初期値MATLAB の変数または関数に依存しない C 式を指定します。

value で初期値を指定しない場合、変数を使用する前にその値を初期化してください。coder.opaque で宣言された変数は、以下のように初期化します。

  • coder.opaque を使用して宣言された同じ型をもつ変数、または coder.opaque を使用して宣言された変数から代入された同じ型をもつ変数のいずれかから値を代入する

  • 外部 C 関数から値を代入する

  • coder.wref を使用して、外部関数に変数のアドレスを渡す

type で指定される型をもつ value を指定します。それ以外の場合、生成されたコードから予期しない結果が生じる可能性があります。

例: 'NULL'

データ型: char

type の定義を含むヘッダー ファイルの名前。文字列定数として指定。

システム ヘッダー ファイルの場合、山かっこを使用します。

例: '<stdio.h>' は、次の行列を出力します。 #include <stdio.h>

アプリケーション ヘッダー ファイルの場合、二重引用符を使用します。

例: '"foo.h"' は、次の行列を出力します。 #include "foo.h"

山かっこまたは二重引用符を省略した場合、コード生成ソフトウェアは二重引用符を生成します。

例: 'foo.h' は、次の行列を出力します。 #include "foo.h"

ビルド コンフィギュレーション パラメーターでインクルード パスを指定してください。

例: cfg.CustomInclude = 'c:\myincludes'

データ型: char

詳細

すべて折りたたむ

ヒント

  • 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.opaquevalue で指定された値を返します。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 で導入

この情報は役に立ちましたか?