Генерация кода для перечислений

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

Для генерации кода, когда вы используете перечисления, придерживаются этих ограничений:

Задайте перечисления для генерации кода

Для генерации кода класс перечисления должен вывести из одного из этих базовых типов: int8uint8int16uint16, или int32. Например:

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++ 03 кода, сгенерированное перечисление:

enum LEDcolor
{
    GREEN = 1,
    RED
};

Если вы генерируете C++ 11 кодов, сгенерированное перечисление явным образом задает базовый тип:

enum LEDcolor : int
{
  GREEN = 1, 
  RED
};

Базовый тип Отличается от Нативного Целочисленного типа.  Предположим, что встроенный целочисленный базовый тип для перечисления отличается от нативного целочисленного типа для целевой платформы. Например, рассмотрите это определение перечислимого типа MATLAB:

classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end    
end

  • Если вы генерируете код С, генератор кода производит typedef оператор для перечислимого типа и #define операторы для перечисляемых значений. Например, определение перечислимого типа LEDcolor производит этот код С:

    typedef short LEDcolor;
    #define GREEN ((LEDcolor)1)
    #define RED ((LEDcolor)2)
    

  • Если вы генерируете C++ 03 кода, члены перечисления преобразованы в константы. Эти константы принадлежат пространству имен, которое содержит определение перечисляемого типа в сгенерированном Коде С++.

    Например, предположите, что вы помещаете определение перечислимого типа LEDcolor в пакете pkg. Поведение по умолчанию генератора кода должно преобразовать пакеты MATLAB в пространства имен 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 LEDcolor : short
    {
      GREEN = 1, // Default value
      RED
    };
    
    }

Тип C/C++ в typedef оператор или базовый тип C++ 11 перечислений зависят от:

Позволенные операции на перечислениях

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

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

оператор присваивания: =

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 state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

Функции тулбокса MATLAB та поддержка перечисления

Для генерации кода можно использовать перечисления с этими функциями тулбокса MATLAB:

Похожие темы