ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

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 で宣言された変数を比較します。

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

入力引数

すべて展開する

type - 変数の型文字列

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

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

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

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

例: 'FILE *'

データ型:char

value - 変数の初期値文字列

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

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

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

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

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

例: 'NULL'

データ型:char

HeaderFile - ヘッダー ファイルの名前文字列

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

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

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

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

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

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

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

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

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

データ型:char

詳細

すべて展開する

ヒント

  • 関数 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

参考

| | |

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