主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

coder.opaque

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

説明

y = coder.opaque (类型は,生成コード内で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 (类型价值yの型と初期値を指定します。

y = coder.opaque (___“大小”,大小yのサイズ(バイト数)を指定します。サイズの指定には,前の構文のいずれかを使用できます。

y = coder.opaque (___“HeaderFile”,HeaderFileは型定義が含まれているヘッダーファイルを指定します。コードジェネレーターは,生成コードで必要とされるヘッダーファイルの# includeステートメントを生成します。ヘッダーファイルの指定には,前の構文のいずれかを使用できます。

初期値が指定された変数の宣言

myfunの呼び出しが成功したときに1を返す関数valtestのコードを生成します。この関数は,coder.opaqueを使用して,初期値0をもつint型変数x1を宣言します。x2 = x1の代入を行うと,x1と同じ型と初期値をもつ変数x2が宣言されます。

関数valtestを記述します。

函数y = valtest% codegen%声明x1为一个初始值为“0”的整数x1 = coder.opaque (“int”' 0 ');声明x2具有与x1相同的类型和初始值x1, x2 =x2 = coder.ceval (“myfun”);%通过比较x1的值来测试调用'myfun'的结果如果x = x y = 0;其他的y = 1;结束结束

初期値とヘッダーファイルが指定された変数の宣言

fopen /从文件中读/文件关闭を使用して独自のソースコードを返すMATLAB関数のコードを生成します。この関数は,coder.opaqueを使用して,fopen /从文件中读/文件关闭で使われるファイルポインターを格納する変数を宣言します。coder.opaqueの呼び出しにより,初期値,ヘッダーファイル< stdio . h >をもつ文件*型変数fが宣言されます。

MATLAB関数を記述します。

函数缓冲=鱼片% # codegen%声明'f'为不透明类型'FILE *',初始值为'NULL '%指定包含file *类型定义的头文件;f = coder.opaque (“文件*”“零”“HeaderFile”' < stdio . h >”);%以二进制模式打开文件f = coder.ceval (fopen的装运箱(“filetest.m”),装运箱(rb的));%从文件中读取,直到到达并放置文件的末尾%内容进入缓冲区n = int32 (1);我= int32 (1);缓冲=字符(0 (8192));n > 0%默认情况下,MATLAB转换常量值%在生成的代码中为双精度%,因此插入显式的类型转换到int32。n = coder.ceval (从文件中读的coder.ref(缓冲区(i)), int32 (1),...int32(元素个数(缓冲),f);I = I + n;结束coder.ceval (“关闭”f);缓冲= strip_cr(缓冲);在MATLAB字符向量的末尾添加一个C终止字符'\0'函数Y = cstring(x) Y = [x char(0)];%删除所有字符13 (CR),但保留字符10 (LF)函数if (j = 1, j = 1, j = 1);i = 1:元素个数(缓冲)如果Buffer (i) ~= char(13);J = J + 1;结束结束缓冲(i) = 0;

coder.opaqueで宣言された変数の比較

ファイルのオープンに成功したかどうかをテストするために,coder.opaqueで宣言された変数を比較します。

coder.opaqueを使用して,初期値をもつ文件*型変数を宣言します。

null = coder.opaque (“文件*”“零”“HeaderFile”' < stdio . h >”);

代入により,と同じ型と値をもつ別の変数ftmpを宣言します。

ftmp =零;ftmp = coder.ceval (fopen的,(“testfile.txt”char (0)], [“r”char (0)));

変数の比較

如果ftmp = =零%错误条件结束

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関数を書き込みます。

函数y = castopaque (s1, s2)% <0 -第一个不匹配的字符在s1中的值小于s2中的值% 0 -两个字符串的内容相等% >0 -第一个不匹配的字符在s1中的值大于s2中的值% # codegencoder.cinclude (' < string.h >”);N = min(numel(s1), numel(s2));%转换要与size_t比较的字符数nsizet =投(n,“喜欢”coder.opaque (“size_t”' 0 '));%返回值为int类型retval = coder.opaque (“int”);retval = coder.ceval (“strncmp”, cstr(s1), cstr(s2), nsizet);%将不透明返回值转换为MATLAB值y =投(retval,“int32”);%--------------函数sc =装运箱(s)% NULL结束一个MATLAB字符向量为CSc = [s, char(0)];

墨西哥人関数を生成します。

codegencastopaquearg游戏{空白(3),空格(3)}报告

入力“abc”および“abc”を指定して墨西哥人関数を呼び出します。

castopaque_mex (“abc”“abc”
ans = 0

文字列が等しいため,出力は0になります。

入力“abc”およびabd的を指定して墨西哥人関数を呼び出します。

castopaque_mex (“abc”abd的
ans = 1

2番目の文字列の3番目の文字dが最初の文字列の3番目の文字cより大きいため,出力は-1になります。

入力abd的および“abc”を指定して墨西哥人関数を呼び出します。

castopaque_mex (abd的“abc”
ans = 1

最初の文字列の3番目の文字dが2番目の文字列の3番目の文字cより大きいため,出力は1になります。

MATLABワークスペースでは,yの型はint32であると確認できます。

初期値とサイズが指定された変数の宣言

yを初期値0の4バイト整数として宣言します。

y = coder.opaque (“int”' 0 '“大小”4);

入力引数

すべて折りたたむ

生成されたコード内の変数の型。类型はコンパイル時の定数でなければなりません。この型は,以下のいずれかでなければなりません。

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

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

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

例:“文件*”

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

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

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

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

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

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

例:“零”

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

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

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

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

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

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

例:“foo””は,次の行列を出力します。# include“foo”

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

例:“foo”は,次の行列を出力します。# include“foo”

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

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

ヒント

  • 类型で指定される型をもつ价值を指定します。それ以外の場合,生成されたコードから予期しない結果が生じる可能性があります。たとえば,次のcoder.opaque宣言により予期しない結果が生じる場合があります。

    y = coder.opaque (“int”,'0.2')

  • 関数coder.opaqueは,変数の型を宣言します。変数のインスタンスは作成しません。後で,MATLABコードでこの関数を使用して,変数のインスタンスを作成することができます。以下の例では,関数coder.cevalからfp1に代入することで,fp1のインスタンスが作成されます。

    %声明类型为FILE *的fp1fp1 = coder.opaque (“文件*”);%创建变量fp1fp1 = coder.ceval (fopen的,(“testfile.txt”char (0)], [“r”char (0)));

  • MATLAB環境では,coder.opaque价值で指定された値を返します。价值を指定しない場合,空の文字ベクトルが返されます。

  • coder.opaqueを使用して宣言された変数またはcoder.opaqueを使用して宣言された変数から値を代入された変数を比較することができます。これらの変数は同じ型でなければなりません。以下に,これらの変数を比較する例を示します。coder.opaqueで宣言された変数の比較

  • 生成コードで同じヘッダーファイルが何度もインクルードされるのを防ぐには,条件付きプリプロセッサ命令#如果未定义および# endifでヘッダーファイルを囲みます。次に例を示します。

    #ifndef MyHeader_h #define MyHeader_h  #endif . define MyHeader_h  #endif . define MyHeader_h
  • MATLABの関数を使用して,変数をcoder.opaqueを使用して宣言されている変数にキャストするか,この変数からキャストします。数値型の場合のみcoder.opaqueを指定してを使用します。

    coder.opaqueによって宣言された変数をMATLABの型にキャストするために,B =投(类型)構文を使用できます。次に例を示します。

    x = coder.opaque (' size_t ', ' 0 ');X1 = cast(x, 'int32');

    B =投(“喜欢”,p)構文を使うこともできます。次に例を示します。

    x = coder.opaque (' size_t ', ' 0 ');X1 = cast(x, 'like', int32(0));

    coder.opaqueによって宣言された変数の型にMATLAB変数をキャストするには,B =投(“喜欢”,p)構文を使用しなければなりません。次に例を示します。

    x = int32 (12);x1 = coder.opaque (“size_t”,' 0 ');X2 = cast(x, 'like', x1));

    以下について,正しいデータ型を生成するにはcoder.opaqueを指定してを使用します。

    • coder.cevalを使用して呼び出すC / c++関数への入力。

    • coder.cevalを使用して呼び出すC / c++関数からの出力に割り当てられる変数。

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

R2011aで導入