Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

coder.opaque

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

説明

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 = coder.opaque(___,'Size',Size)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 を宣言します。出力 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 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 はコンパイル時の定数でなければなりません。この型は、以下のいずれかでなければなりません。

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

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

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

例: 'FILE *'

生成されたコード内の変数の初期値。value はコンパイル時の定数でなければなりません。MATLAB の変数または関数に依存しない C 式を指定します。

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

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

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

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

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

例: 'NULL'

生成されたコード内の変数のバイト数。整数として指定します。サイズを指定しない場合、変数のサイズは 8 バイトになります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

type の定義を含むヘッダー ファイルの名前。HeaderFile はコンパイル時の定数でなければなりません。

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

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

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

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

山かっこまたは二重引用符を省略した場合、コード ジェネレーターは二重引用符を生成します。

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

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

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

ヒント

  • 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++ 関数からの出力に割り当てられる変数。

    このキャストを行わなくても、コード生成中にコンパイラの警告が表示されることがあります。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2011a で導入