生成コードの型への MATLAB 型のマッピング
コード ジェネレーターは、MATLAB® コードで使用するデータ型に対応する C/C++ のデータ型を生成します。生成されるデータ型はターゲット プラットフォームとコンパイラに依存します。コード ジェネレーターは、組み込みの C データ型 (short
、long
、int
など)、または C の typedef
ステートメントを使用して定義されるカスタム データ型のいずれかを生成できます。既定では、コード ジェネレーターはスタンドアロン コード (lib、dll または exe) に対しては組み込みデータ型、MEX コードに対してはカスタム データ型を生成します。組み込みの C の型を使用するには、コード生成構成オブジェクトの DataTypeReplacement
プロパティを変更するか、MATLAB Coder™ アプリを使用します。詳細については、生成コードで使用されるデータ型の指定を参照してください。
カスタム C/C++ 型を生成するために、コード ジェネレーターは、fullfile(matlabroot,'extern','include')
に配置されているヘッダー ファイル tmwtypes.h
の事前定義されたデータ型を使用します。コード ジェネレーターは、MATLAB コードの解析に基づいてカスタム データ型を生成することもできます。カスタム データ型は、コード生成ディレクトリに配置されているファイル rtwtypes.h
と myFunction_types.h
で定義されます。myFunction
は最上位の関数の名前です。コード ジェネレーターは、MATLAB 内に存在するすべてのデータ型に対してコードを生成できるわけではありません。C/C++ コード生成でサポートされている MATLAB 言語機能を参照してください。
組み込みの C データ型を使用しないときは、コード ジェネレーターは以下のデータ型を生成します。
MATLAB データ型 | 対応するカスタム C/C++ データ型 |
---|---|
logical | boolean_T |
char | char_T |
string | rtString |
int8 | int8_T |
int16 | int16_T |
int32 | int32_T |
int64 | int64_T |
uint8 | uint8_T |
uint16 | uint16_T |
uint32 | uint32_T |
uint64 | uint64_T |
single | real32_T |
double | real_T |
complex | 複素数型を参照してください。 |
struct | 構造体の型を参照してください。 |
fi | 固定小数点型を参照してください。 |
変数が参照渡しされるとき、対応するカスタム データ型は逆参照演算子を使用します。たとえば、参照渡しされる際の int8
の対応するカスタム C/C++ データ型は int8_T*
です。
動的に割り当てられた配列はカスタム emxArray_
型にマッピングされます。たとえば、動的に割り当てられた char
配列は emxArray_char_T
の型にマッピングされます。動的に割り当てられた double 配列は emxArray_real_T
型にマッピングされます。動的な割り当ては、たとえばコンパイル時に配列サイズが不明である場合や、明示的な上限を指定せずに coder.varsize
を使用して可変サイズの配列を作成する場合に発生します。可変サイズ配列の詳細については、生成された関数インターフェイスでの C 配列の使用を参照してください。
複素数型
MATLAB では、実数/複素数はデータ型のプロパティとして定義されます。次の表に、コード ジェネレーターが MATLAB の複素数データ型に対して使用する事前定義されたデータ型を示します。
MATLAB の複素数データ型 | 対応するカスタム C/C++ データ型 |
---|---|
int8 | cint8_T |
int16 | cint16_T |
int32 | cint32_T |
int64 | cint64_T |
uint8 | cuint8_T |
uint16 | cuint16_T |
uint32 | cuint32_T |
uint64 | cuint64_T |
single | creal32_T |
double | creal_T |
コード ジェネレーターは、各複素数値を、実数部 re
と虚数部 im
をもつ構造体として定義します。例として、tmwtypes.h
からの creal32_T
の typedef
を参照してください。
typedef struct { real32_T re;/* Real component*/ real32_T im;/* Imaginary component*/ } creal32_T;
creal32_T
型の変数 x
を定義するとします。生成されたコードは、実数部を x.re
として、虚数部を x.im
としてアクセスします。C/C++ ライブラリが異なる表現を必要とする場合、たとえば coder.cstructname
を使用して、MATLAB Coder の複素数型の独自バージョンを定義することができます。ただし、定義において実数部には re
、虚数部には im
という名前を使用しなければなりません。
詳細については、複素数データのコード生成を参照してください。
構造体の型
MATLAB Coder は、構造体をフィールド単位で C/C++ の型にマッピングします。MATLAB 定義での構造体フィールドの順序が保持されます。生成される C/C++ 構造体の型の名前を制御するか、定義を指定するには、関数 coder.cstructname
を使用します。動的メモリ割り当てを使用しない場合は、構造体内の配列は 1 次元の配列に変換され、ポインターには変換されません。詳細については、構造体を参照してください。
固定小数点型
C/C++ データ型は fi
オブジェクトの numerictype
プロパティによって決定されます。既定では、コード ジェネレーターは組み込みの C/C++ 型の使用を試みます。ただし、カスタム C/C++ データ型を代わりに使用するよう選択することもできます。次の表は、Signedness
、WordLength
および FractionLength
の各プロパティがどのようにカスタム C/C++ データ型を決定するかを示しています。カスタム C/C++ データ型は、ワード サイズに基づいて、固定小数点の値を格納できる一段大きいターゲット ワード サイズとなります。整数型の符号は、固定小数点型の符号と一致します。
符号属性 | 語長 | 小数部の長さ | 対応するカスタム C/C++ データ型 |
---|---|---|---|
1 | 8 | 7 | int8_T |
1 | 13 | 10 | int16_T |
1 | 16 | 15 | int16_T |
0 | 19 | 15 | uint32_T |
文字ベクトル
MATLAB Coder ソフトウェアは、MATLAB 文字ベクトルを C/C++ 文字配列にマッピングします。これらの文字配列は、null で終了しないため C/C++ 文字列ではありません。MATLAB 文字ベクトルを、C/C++ 文字列を必要とする外部 C/C++ コードに渡す場合、生成される C/C++ 文字配列は null で終了しなければなりません。null で終了する C/C++ 文字配列を生成するには、MATLAB 文字ベクトルの終わりに 0 を追加します。たとえば、['sample text' 0]
とします。これをしないと、文字列を想定している生成コードの動作がコンパイラ エラーや警告なしに停止する可能性があります。
マルチワードの型
マルチワードの型は、ターゲット ハードウェアが MATLAB データ型を組み込みの C/C++ 型に格納できないときに生成されるカスタム型です。マルチワードの型は、整数の配列を含む C/C++ 構造体型として生成されます。配列の次元は、ターゲット ハードウェアの最も幅広の整数型のサイズに依存します。
たとえば、128 ビットの固定小数点型の場合、ターゲット ハードウェアの最も幅広の整数型が 32 ビットであれば、ソフトウェアは 4 つの 32 ビット整数からなる配列を 1 つ含む構造体を生成します。
typedef struct { unsigned int chunks[4]; } uint128m_T;
ターゲット ハードウェアの最も幅広の整数型が 64 ビットのサイズをもつ long
であれば、コード ジェネレーターは 2 つの 64 ビット長の型からなる配列を 1 つ含む構造体を生成します。
typedef struct { unsigned long chunks[2]; } uint128m_T;
64 ビットの整数 MATLAB 型から生成される C/C++ データ型は、ターゲット ハードウェアでの整数型のサイズに依存します。64 ビットを格納するのに十分な幅をもつ組み込み型が存在しない場合、64 ビットの MATLAB Coder 型はカスタム マルチワード型にマッピングされます。
参考
coder.cstructname
| coder.opaque