Перечисления представляют фиксированный набор именованных значений. Перечисления помогают сделать ваш MATLAB® код и сгенерированный код C/C + + более читаемый. Для примера сгенерированный код может протестировать равенство с таким кодом, как if (x == Red)
вместо использования strcmp
.
Для генерации кода, когда вы используете перечисления, придерживайтесь следующих ограничений:
Вызовы методов классов перечисления не поддерживаются.
Передача строк или векторов символов конструкторам перечислений не поддерживается.
Класс перечисления должен быть выведен из одного из следующих базовых типов: int8
, uint8
, int16
, uint16
, или int32
. См. «Определение перечислений для генерации кода».
Для перечислений можно использовать только ограниченный набор операций. См. «Разрешенные операции с перечислениями».
Используйте перечисления с функциями, которые поддерживают перечисленные типы для генерации кода. Смотрите Тулбокс функций MATLAB, которые Поддержка перечисления.
Для генерации кода класс перечисления должен быть выведен из одного из следующих базовых типов: int8
, uint8
, int16
, uint16
, или int32
. Для примера:
classdef PrimaryColors < int32 enumeration Red(1), Blue(2), Yellow(4) end end
Можно использовать базовый тип для управления размером перечисляемого типа в сгенерированном коде C/C + +. Вы можете:
Представьте перечисленный тип как целое число с фиксированным размером, которое переносится в различные целевые объекты.
Уменьшите использование памяти.
Интерфейс с унаследованным кодом.
Соответствовать стандартам компании.
Базовый тип определяет представление перечисляемого типа в сгенерированном коде C/C + +.
Если базовый тип является собственным целым типом для целевой платформы (для примера, int32
), генератор кода производит перечисленный тип C/C + +. Примите во внимание это определение перечисленного типа MATLAB:
classdef LEDcolor < int32 enumeration GREEN(1), RED(2) end end
Это перечисленное определение типа приводит к следующему коду C/C + +:
enum LEDcolor { GREEN = 1, RED }; typedef enum LEDcolor LEDcolor;
Для встроенных целочисленных базовых типов, которые отличаются от собственного целого типа для целевой платформы:
Если вы генерируете код С, генератор кода производит typedef
оператор для перечисляемых типа и #define
операторы для перечисленных значений. Примите во внимание это определение перечисленного типа MATLAB:
classdef LEDcolor < int16 enumeration GREEN(1), RED(2) end end
typedef short LEDcolor; #define GREEN ((LEDcolor)1) #define RED ((LEDcolor)2)
Если вы генерируете код С++, представители перечисления преобразуются в константы. Эти константы принадлежат пространству имен, которое содержит определение перечисляемого типа в сгенерированном коде С++.
Например, предположим, что вы помещаете это определение перечисленного типа MATLAB внутрь пакета pkg
:
classdef LEDcolor < int16 enumeration GREEN(1), RED(2) end end
pkg
:namespace pkg { typedef short LEDcolor; // enum pkg_LEDcolor const LEDcolor GREEN{1}; const LEDcolor RED{2}; }
Тип C/C + + в typedef
оператор зависит от:
Целочисленные размеры, заданные для производственного оборудования в настройках объекта аппаратной реализации или проекта. См. coder.HardwareImplementation
.
Настройка, которая определяет использование встроенных типов C или MathWorks® шрифты в сгенерированном коде. См. «Определение типов данных, используемых в сгенерированном коде и отображение типов MATLAB с типами в сгенерированном коде».
Для генерации кода вы ограничены операциями с перечислениями, перечисленными в этой таблице.
Операция | Пример | Примечания |
---|---|---|
оператор назначения: |
xon = LEDcolor.GREEN xoff = LEDcolor.RED |
— |
реляционные операторы: |
xon == xoff |
Генерация кода не поддерживает использование |
операция приведения |
double(LEDcolor.RED) |
— |
преобразование в символьный массив или строку |
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 |
— |
Для генерации кода можно использовать перечисления с этими функциями тулбокс: