Определение классов MATLAB для генерации кода

Чтобы сгенерировать эффективный автономный код для MATLAB® классы должны использоваться по-другому, чем при запуске кода в среде MATLAB.

Что отличаетсяДополнительная информация
Ограниченный набор языковых функций.Языковые ограничения
Ограниченный набор функций генерации кода.Функции генерации кода, несовместимые с классами
Определение свойств классов.Определение свойств класса для генерации кода
Использование классов handle.

Сгенерируйте код для классов Handle MATLAB и системных объектов

Генерация кода для деструкторов классов Handle

Ограничения, накладываемые на объекты указатель для генерации кода

Глобальные переменные, содержащие указатель объектов MATLAB, не поддерживаются для генерации кода.Н/Д
Наследование от встроенных классов MATLAB не поддерживается.Наследование от встроенных классов MATLAB не поддерживается

Языковые ограничения

Хотя поддержка генерации кода предусмотрена для общих функций классов, таких как свойства и методы, существует ряд расширенных функций, которые не поддерживаются, таких как:

  • События

  • Прослушиватели

  • Массивы объектов

  • Рекурсивные структуры данных

    • Связанные списки

    • Деревья

    • Графики

  • Вложенные функции в конструкторах

  • Перегрузочные операторы subsref, subsassign, и subsindex

    В MATLAB классы могут определять свои собственные версии subsref, subsassign, и subsindex методы. Генерация кода не поддерживает классы, которые имеют свои собственные определения этих методов.

  • The empty метод

    В MATLAB классы имеют встроенный статический метод, empty, который создает пустой массив класса. Генерация кода не поддерживает этот метод.

  • Следующие классу Handle MATLAB методы:

    • addlistener

    • eq

    • findobj

    • findpro

  • The AbortSet атрибут свойства

Функции генерации кода, несовместимые с классами

  • Можно сгенерировать код для функций MATLAB точки входа, которые используют классы, но вы не можете сгенерировать код непосредственно для класса MATLAB.

    Для примера, если ClassNameA является определением класса, вы не можете сгенерировать код путем выполнения:

    codegen ClassNameA

  • Объект класса handle не может быть входным параметром функции или выходом точки входа.

  • Объект класса значения может быть входным параметром функции точки входа или выходом. Однако, если объект класса значения содержит объект класса handle, то объект класса значения не может быть входным параметром функции или выходом точки входа. Объект класса handle не может быть входным параметром функции или выходом точки входа.

  • Генерация кода не поддерживает глобальные переменные, которые являются классами handle.

  • Вы не можете использовать классы для Simulink® сигналы, параметры или память хранилища данных.

  • Генерация кода не поддерживает назначение объекта класса значения свойству nontunable. Для примера, obj.prop=v; недопустимо при prop является свойством nontunable и v является объектом, основанным на классе значений.

  • Вы не можете использовать coder.extrinsic объявить класс или метод внешним.

  • Вы не можете передать класс MATLAB coder.ceval. Вы можете передать свойства класса в coder.ceval.

  • Если свойство имеет метод get, метод set, или validators, или является свойством System object™ с определенными атрибутами, то вы не можете передать свойство по ссылке на внешнюю функцию. Для некоторых свойств см. Раздел «Передача по ссылке» не поддерживается.

  • Если вы используете классы в коде в блоке MATLAB Function, вы не можете использовать отладчик для просмотра информации о классе.

  • Если объект имеет повторяющиеся имена свойства, и генератор кода пытается постоянно складывать объект, генерация кода может завершиться неуспешно. Генератор кода constant-складывает объект, когда он используется с coder.const, или когда это вход или вывод от постоянной свернутой внешней функции.

    Повторяющиеся имена свойства происходят в объекте подкласса в следующих ситуациях:

    • Подкласс имеет свойство с таким же именем, что и свойство суперкласса.

    • Подкласс происходит из нескольких суперклассов, которые используют одно и то же имя для свойства.

    Для получения информации о том, когда MATLAB разрешает повторяющиеся имена свойства, смотрите Подклассы нескольких классов.

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

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

  • Ошибка валидации свойства завершает симуляцию сообщением об ошибке. Чтобы протестировать валидацию свойств, лучшая практика запустить симуляцию по полной области значений входа значений. Код C/C + +, сгенерированный Simulink, не Coder™does обнаружить или сообщить об ошибках валидации свойств.

  • После определения свойства не присваивайте ему несовместимый тип. Не используйте свойство перед попыткой его роста.

    Когда вы задаете свойства класса для генерации кода, учитывайте те же факторы, которые вы учитываете при определении переменных. В языке MATLAB переменные могут динамически изменять свой класс, размер или сложность во время исполнения, поэтому можно использовать ту же переменную, чтобы удерживать значение различного класса, размера или сложности. C и C++ используют статическое типирование. Перед использованием переменных, чтобы определить их тип, генератор кода требует полного назначения каждой переменной. Точно так же перед использованием свойств необходимо явным образом задать их класс, размер и сложность.

  • Начальные значения:

    • Если свойство не имеет явного начального значения, генератор кода принимает, что оно не определено в начале конструктора. Генератор кода не присваивает пустую матрицу как значение по умолчанию.

    • Если свойство не имеет начального значения, и генератор кода не может определить, что свойство назначено до первого использования, программное обеспечение генерирует ошибку компиляции.

    • Для системных объектов, если свойство nontunable является структурой, необходимо полностью назначить структуру. Вы не можете выполнить частичное назначение с помощью индексирования.

      Для примера, для свойства nontunable, можно использовать следующее назначение:

      mySystemObject.nonTunableProperty=struct('fieldA','a','fieldB','b');
      

      Вы не можете использовать следующие частичные назначения:

      mySystemObject.nonTunableProperty.fieldA = 'a';
      mySystemObject.nonTunableProperty.fieldB = 'b';

    • coder.varsize не поддерживается для свойств класса.

    • Если начальное значение свойства является объектом, то свойство должно быть постоянным. Чтобы сделать свойство постоянным, объявите Constant атрибут в блоке свойств. Для примера:

      classdef MyClass 
          properties (Constant) 
              p1 = MyClass2; 
          end 
      end 

    • MATLAB вычисляет начальные значения классов во время загрузки классов перед генерацией кода. Если вы используете стойкие переменные в инициализации свойства класса MATLAB, значение стойкой переменной, вычисляемое, когда нагрузки класса принадлежат MATLAB; это не значение, используемое во время генерации кода. Если вы используете coder.target в инициализации свойства класса MATLAB, coder.target('MATLAB') возвращает true (1).

  • Свойства переменного размера:

    • Генерация кода поддерживает верхние и неограниченные свойства переменного размера для классов value и handle.

    • Чтобы сгенерировать неограниченные свойства класса переменного размера, включите динамическое выделение памяти.

    • Чтобы сделать свойство класса переменного размера, выполните два последовательных назначения свойства класса: одно - скаляру и следующее - массиву.

      classdef varSizeProp1 < handle
          properties
              prop
              varProp
          end
      end
      
      function extFunc(n)
          obj = varSizeProp1;    
          % Assign a scalar value to the property.
          obj.prop = 1;
          obj.varProp = 1;
          % Assign an array to the same property to make it variable-sized.
          obj.prop = 1:98;    
          obj.varProp = 1:n;
      end

      В предыдущем коде первое назначение prop и varProp является скалярным, и их второе назначение - массиву с тем же базовым типом. Размер prop имеет верхнюю границу 98, что делает его верхним-ограниченным, свойством переменного размера.

      Если n неизвестен во время компиляции, obj.varProp является неограниченным свойством переменного размера. Если это известно, это свойство класса верхнего размера.

    • Если свойство class инициализировано массивом переменного размера, свойство имеет переменный размер.

      classdef varSizeProp2 
          properties
              prop
          end
          methods
              function obj = varSizeProp2(inVar)
                  % Assign incoming value to local variable
                  locVar = inVar;
                  
                  % Declare the local variable to be a variable-sized column             
                  % vector with no size limit
                  coder.varsize('locVar',[inf 1],[1 0]);
                  
                  % Assign value
                  obj.prop = locVar;
               end
          end
      end

      В предыдущем коде inVar передается в конструктор классов и хранится в locVar. locVar изменяется на переменный размер по coder.varsize и присвоенный свойству class obj.prop, что делает свойство переменным размером.

      • Если вход к вызову функции varSizeProp2 переменный размер, coder.varsize не требуется.

        function z = constructCall(n)
            z = varSizeProp2(1:n);
        end
      • Если значение n неизвестен во время компиляции и не имеет заданных границ, z.prop является неограниченным свойством класса переменного размера.

      • Если значение n неизвестен во время компиляции и имеет заданные границы, z.prop является верхним свойством класса переменного размера.

  • Если свойство является постоянным, а его значение является объектом, вы не можете изменить значение свойства этого объекта. Например, предположим, что:

    • obj является объектом myClass1.

    • myClass1 имеет постоянное свойство p1 что является объектом myClass2.

    • myClass2 имеет свойство p2.

    Генерация кода не поддерживает следующий код:

    obj.p1.p2 = 1;

Наследование от встроенных классов MATLAB не поддерживается

Вы не можете сгенерировать код для классов, которые наследуют от встроенных классов MATLAB. Для примера вы не можете сгенерировать код для следующего класса:

classdef myclass < double