列挙型のコードの生成
列挙型は名前付きの値の固定セットを表します。 列挙型を使用すると、MATLAB® コードと生成される C/C++ コードが読みやすくなります。たとえば、strcmp
を使用する代わりに、生成されたコードで if (x == Red)
などのコードとの等価性をテストできます。
コード生成で列挙型を使用する場合、次の制限に従います。
列挙型クラスのメソッドの呼び出しはサポートされません。
string または文字ベクトルを列挙型のコンストラクターに渡すことはサポートされません。
列挙型クラスは
int8
、uint8
、int16
、uint16
、int32
、uint32
のいずれかの基本データ型から派生しなければなりません。コード生成用列挙型の定義を参照してください。uint32
列挙型のメンバーについて、コード生成ではintmax("int32")
以下の値がサポートされます。列挙型に対しては限られた一連の操作のみを使用できます。列挙型で実行可能な演算を参照してください。
コード生成用に列挙型をサポートする関数で列挙型を使用します。列挙型をサポートする MATLAB ツールボックス関数を参照してください。
コード生成用列挙型の定義
コード生成では、列挙型クラスは int8
、uint8
、int16
、uint16
、int32
、uint32
のいずれかの基本データ型から派生しなければなりません。次に例を示します。
classdef PrimaryColors < int32 enumeration Red(1), Blue(2), Yellow(4) end end
生成される C/C++ コード内の列挙型のサイズを基本データ型を使用して制御できます。以下を行うことができます。
列挙型を固定サイズの整数で表し、別のターゲットへの移植を可能にします。
メモリ使用量を削減します。
レガシ コードと連動させます。
会社標準に一致させます。
生成されたコードにおける列挙型の表現
生成された C/C++ コード内の列挙型の表現は、以下によって決まります。
MATLAB 列挙型の基本データ型
ターゲット言語 (C または C++)
ターゲット言語が C++ の場合は、ターゲット言語標準 (C++03 または C++11)
基本データ型がネイティブ整数型の場合. 基本データ型がターゲット プラットフォームのネイティブ整数型 (int32
など) の場合、コード ジェネレーターは C/C++ の列挙型を生成します。この MATLAB 列挙型定義について考えます。
classdef LEDcolor < int32 enumeration GREEN(1), RED(2) end end
C コードまたは C++03 コードを生成する場合、生成される列挙型は次のようになります。
enum LEDcolor { GREEN = 1, RED };
C++11 コードを生成する場合、生成されるコードには、基となる型を明示的に定義する列挙クラスが含まれます (既定の設定)。
enum class LEDcolor : int { GREEN = 1, RED };
基本データ型がネイティブ整数型とは異なる場合. 列挙型の組み込みの整数基本データ型がターゲット プラットフォームのネイティブ整数型とは異なるとします。たとえば、次の MATLAB 列挙型定義について考えます。
classdef LEDcolor < int16 enumeration GREEN(1), RED(2) end end
C コードを生成する場合、コード ジェネレーターは列挙型に対して
typedef
ステートメントを生成し、列挙値に対して#define
ステートメントを生成します。たとえば、列挙型定義LEDcolor
は次の C コードになります。typedef short LEDcolor; #define GREEN ((LEDcolor)1) #define RED ((LEDcolor)2)
C++03 コードを生成する場合、列挙型メンバーが定数に変換されます。それらの定数は、生成された C++ コードの列挙型定義を含む名前空間に属します。
たとえば、列挙型定義
LEDcolor
をパッケージpkg
内に配置するとします。コード ジェネレーターの既定の動作では、MATLAB パッケージは C++ 名前空間に変換されます。生成された C++ コードは名前空間pkg
内に配置されます。namespace pkg { typedef short LEDcolor; // enum pkg_LEDcolor const LEDcolor GREEN{1}; const LEDcolor RED{2}; }
C++11 では、MATLAB と同様に列挙型の基となる型を指定できます。C++11 コードを生成する場合、MATLAB 列挙クラスは、基となる型を明示的に定義する C++ 列挙クラスに変換されます (既定の設定)。
たとえば、列挙型定義
LEDcolor
をパッケージpkg
内に配置するとします。コード ジェネレーターの既定の動作では、MATLAB パッケージは C++ 名前空間に変換されます。生成された C++11 コードは名前空間pkg
内に配置されます。namespace pkg { enum class LEDcolor : short { GREEN = 1, // Default value RED }; }
typedef
ステートメントの C/C++ の型または C++11 列挙型の基となる型は以下に依存します。
ハードウェア実行オブジェクトまたはプロジェクト設定の製品ハードウェアで定義されている整数のサイズ。
coder.HardwareImplementation
を参照してください。生成されたコード内で組み込みの C の型を使用するか、MathWorks® の typedef を使用するかを決定する設定。生成コードで使用されるデータ型の指定および生成コードの型への MATLAB 型のマッピングを参照してください。
通常の C の列挙を含む C++11 コードの生成. コード ジェネレーターの既定の動作を変更して、生成された C++11 コード内で通常の C の列挙を生成できます。次のいずれかを行います。
コード生成構成オブジェクト内で
CppGenerateEnumClass
プロパティをfalse
に設定する。MATLAB Coder™ アプリの [生成] ステップの [コード外観] タブで、[MATLAB 列挙から C++ 列挙クラスを生成] チェック ボックスをオフにする。
コード ジェネレーターに、コード内の特定の MATLAB 列挙クラスに対応する通常の C の列挙を生成するよう指示するには、その MATLAB 列挙クラスの実装に false
を返す静的メソッド generateEnumClass
を含めます。生成されたコードにおける列挙型のカスタマイズを参照してください。
列挙型で実行可能な演算
コード生成では、次の表に示す列挙型の演算に制限されます。
演算 | 例 | メモ |
---|---|---|
代入演算子: |
xon = LEDcolor.GREEN xoff = LEDcolor.RED | — |
関係演算子: |
xon == xoff | コード生成では、 |
キャスト演算 |
double(LEDcolor.RED) | — |
文字配列または string への変換 |
y = char(LEDcolor.RED); y1 = cast(LEDcolor.RED,'char'); y2 = string(LEDcolor.RED); |
|
インデックス演算 |
m = [1 2] n = LEDcolor(m) p = n(LEDcolor.GREEN) | — |
制御フロー ステートメント: if、switch、while |
if state == sysMode.ON led = LEDcolor.GREEN; else led = LEDcolor.RED; end | — |
列挙型をサポートする MATLAB ツールボックス関数
コード生成では、次の MATLAB ツールボックス関数で列挙型を使用できます。