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

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

Что отличаетсяБольше информации
Ограниченный набор функций языка.Ограничения языка
Ограниченный набор функций генерации кода.Генерация кода показывает не совместимый с классами
Определение свойств класса.Определение свойств класса для генерации кода
Использование классов Handle.

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

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

Обработайте объектные ограничения для генерации кода

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

Ограничения языка

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

  • События

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

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

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

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

    • Деревья

    • Графики

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

  • Сверхзагружаемые операторы subsref, subsassign, и subsindex

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

  • empty метод

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

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

    • addlistener

    • eq

    • findobj

    • findpro

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

Генерация кода показывает не совместимый с классами

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

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

    codegen ClassNameA

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

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

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

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

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

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

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

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

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

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

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

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

  • Чтобы протестировать валидацию свойства, это - лучшая практика запустить MEX-функцию по полному спектру входных значений.

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

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

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

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

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

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

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

      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).

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

    • Генерация кода поддерживает верхне ограниченные и неограниченные свойства переменного размера и для значения и для классов 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 неограниченное свойство переменного размера. Если это известно, это - верхне ограниченный, свойство класса переменного размера.

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

      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 и присвоенный свойству 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;

Вызовы конструктора базового класса

Если конструктор класса содержит вызов конструктора базового класса, вызов конструктора базового класса должен прибыть перед for, ifвозврат, switch или while операторы.

Например, если вы задаете класс B на основе класса A:

classdef B < A
    methods
        function obj = B(varargin)
            if nargin == 0
                a = 1;
                b = 2;
            elseif nargin == 1
                a = varargin{1};
                b = 1;
            elseif nargin == 2
                a = varargin{1};
                b = varargin{2};
            end
            obj = obj@A(a,b);
        end    
        
    end
end

Поскольку определение класса для B использует if оператор прежде, чем вызвать конструктора базового класса для A, вы не можете сгенерировать код для функционального callB:

function [y1,y2] = callB
x = B;
y1 = x.p1;
y2 = x.p2;
end

Однако можно сгенерировать код для callB если вы задаете класс B как:

classdef B < A
    methods
        function obj = NewB(varargin)
            [a,b] = getaandb(varargin{:});
            obj = obj@A(a,b);
        end
        
    end
end

function [a,b] = getaandb(varargin)
if nargin == 0
    a = 1;
    b = 2;
elseif nargin == 1
    a = varargin{1};
    b = 1;
elseif nargin == 2
    a = varargin{1};
    b = varargin{2};
end
end

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

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

classdef myclass < double