列挙型のコードの生成
列挙型は名前付きの値の固定セットを表します。列挙型により MATLAB® コードが読みやすくなります。
コード生成で列挙型を使用する場合、次の制限に従います。
列挙型クラスのメソッドの呼び出しはサポートされません。
string または文字ベクトルを列挙型のコンストラクターに渡すことはサポートされません。
列挙型クラスは
int8
、uint8
、int16
、uint16
、int32
、uint32
のいずれかの基本データ型から派生しなければなりません。コード生成用列挙型の定義を参照してください。列挙型に対しては限られた一連の操作のみを使用できます。列挙型で実行可能な演算を参照してください。
コード生成用に列挙型をサポートする関数で列挙型を使用します。列挙型をサポートする MATLAB ツールボックス関数を参照してください。
コード生成用列挙型の定義
コード生成では、列挙型クラスは int8
、uint8
、int16
、uint16
、int32
、uint32
のいずれかの基本データ型から派生しなければなりません。以下に例を示します。
classdef PrimaryColors < int32 enumeration Red(1), Blue(2), Yellow(4) end end
MATLAB Coder™ を使用して C/C++ コードを生成する場合、生成されるコード内の列挙型のサイズを基本データ型を使用して制御できます。次のことが可能です。
列挙型を固定サイズの整数で表し、別のターゲットへの移植を可能にします。
メモリ使用量を削減します。
レガシ コードと連動させます。
会社標準に一致させます。
生成されたコードにおける列挙型の表現
C++11 以降の標準では列挙クラスがサポートされます。C++ コードを生成し、ターゲット言語標準を C++11 以降に設定した場合、コード ジェネレーターは、生成された C++ コードで MATLAB 列挙を列挙クラスに変換します。それ以外の場合、コード ジェネレーターは、生成された C/C++ コードで MATLAB 列挙を通常の C の列挙に変換します。したがって、生成された C/C++ コード内の列挙型の表現は、以下によって決まります。
MATLAB 列挙型の基本データ型
ターゲット言語
ターゲット言語標準 (ターゲット言語が C++ の場合)
ターゲット言語標準を変更するには、コード生成に使用する言語標準の変更 (MATLAB Coder)を参照してください。
基本データ型がネイティブ整数型の場合. 基本データ型がターゲット プラットフォームのネイティブ整数型 (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
を MATLAB 名前空間nmsp
内に配置し、C++03 コードを生成するとします。コード ジェネレーターの既定の動作では、MATLAB 名前空間は C++ 名前空間に変換されます。生成された C++ コードは名前空間nmsp
内に配置されます。namespace nmsp { typedef short LEDcolor; // enum nmsp_LEDcolor const LEDcolor GREEN{1}; const LEDcolor RED{2}; }
C++11 以降の言語標準では、MATLAB と同様に列挙の基となる型を指定できます。C++11 以降の言語標準を使用してコードを生成した場合、MATLAB 列挙クラスは、基となる型を明示的に定義する列挙クラスに変換されます (既定の設定)。
たとえば、列挙型定義
LEDcolor
を MATLAB 名前空間nmsp
内に配置するとします。C++11 コードを生成した場合、コード ジェネレーターの既定の動作では、MATLAB 名前空間は C++ 名前空間に変換されます。生成された C++11 コードは名前空間nmsp
内に配置されます。namespace nmsp { enum class LEDcolor : short { GREEN = 1, // Default value RED }; }
typedef
ステートメント内の C/C++ 型 (C および C++03 コードの場合)、または列挙クラスの基になる型 (C++11 以降のコードの場合) は、以下によって決まります。
ハードウェア実行オブジェクトまたはプロジェクト設定の製品ハードウェアで定義されている整数のサイズ。
coder.HardwareImplementation
(MATLAB Coder) を参照してください。生成されたコード内で組み込みの C の型を使用するか、MathWorks® の typedef を使用するかを決定する設定。生成コードの型への MATLAB 型のマッピング (MATLAB Coder)を参照してください。
通常の C の列挙を含む C++ コードの生成. 列挙クラスがサポートされている C++11 以降などの言語標準でコードを生成する場合でも、通常の C の列挙を生成するようにコード ジェネレーターに指示できます。既定の設定を変更するには、コード生成構成オブジェクトで CppGenerateEnumClass
プロパティを false
に設定します。
コード ジェネレーターに、コード内の特定の 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 ツールボックス関数で列挙型を使用できます。