exponenta event banner

Создание кода для перечислений

Перечисления представляют фиксированный набор именованных значений. Перечисления помогают сделать код MATLAB ® и сгенерированный код C/C + + более читаемым. Например, сгенерированный код может проверять равенство с кодом, таким какif (x == Red) вместо использования strcmp.

При создании кода при использовании перечислений соблюдайте следующие ограничения:

Определение перечислений для создания кода

Для создания кода класс перечисления должен быть производным от одного из следующих базовых типов: 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;

Для встроенных целочисленных базовых типов, которые отличаются от собственного целочисленного типа для целевой платформы:

  • При генерации кода C генератор кода создает typedef оператор для перечисляемого типа и #define операторов для перечисленных значений. Рассмотрим это определение перечисляемого типа MATLAB:

    classdef LEDcolor < int16
        enumeration
            GREEN(1),
            RED(2)
        end
        
    end
    Определение перечисляемого типа создает код C:
    typedef short LEDcolor;
    #define GREEN ((LEDcolor)1)
    #define RED ((LEDcolor)2)
    

  • При создании кода C++ элементы перечисления преобразуются в константы. Эти константы принадлежат пространству имен, содержащему определение типа перечисления в сгенерированном коде C++.

    Например, предположим, что это определение перечисляемого типа MATLAB помещено в пакет pkg:

    classdef LEDcolor < int16
        enumeration
            GREEN(1),
            RED(2)
        end
        
    end
    По умолчанию генератор кода преобразует пакеты MATLAB в пространства имен C++. Сгенерированный код C++ помещается в пространство имен pkg:

    namespace pkg {
    typedef short LEDcolor;
    
    // enum pkg_LEDcolor
    const LEDcolor GREEN{1};
    const LEDcolor RED{2};
    
    }

Тип C/C + + в typedef оператор зависит от:

Разрешенные операции с перечислениями

Для создания кода доступны только операции с перечислениями, перечисленными в этой таблице.

ОперацияПримерПримечания

оператор назначения: =

xon = LEDcolor.GREEN
xoff = LEDcolor.RED

реляционные операторы: < > <= >= == ~=

xon == xoff

Создание кода не поддерживает использование == или ~= для проверки равенства между элементом перечисления и строковым массивом, символьным массивом или массивом ячеек символьных массивов.

операция литья

double(LEDcolor.RED)

преобразование в символьный массив или строку

y = char(LEDcolor.RED);
y1 = cast(LEDcolor.RED,'char');
y2 = string(LEDcolor.RED);

  • Можно преобразовать только скалярные перечисления времени компиляции. Например, этот код запускается в MATLAB, но приводит к ошибке при создании кода:

    y2 = string(repmat(LEDcolor.RED,1,2));
  • Генератор кода сохраняет имена перечислений, если входы преобразования являются константами. Например, рассмотрим следующее определение перечисляемого типа:

    classdef AnEnum < int32
        enumeration
            zero(0),
            two(2),
            otherTwo(2)
        end
    end

    Сгенерированный код создает "two" для

    y = string(AnEnum.two)
    и "otherTwo" для
    y = string(AnEnum.otherTwo)

операция индексирования

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:

Связанные темы