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

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

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

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

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

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

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

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

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

  • События

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

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

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

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

    • Деревья

    • Графики

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

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

  • Метод empty

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

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

    • addlistener

    • delete

    • eq

    • findobj

    • findpro

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

  • Класс, который имеет переходное свойство, не может быть входом к или вывести от функции точки входа или внешней функции.

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

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

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

    codegen ClassNameA

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

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

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

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

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

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

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

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

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

    Для получения информации о том, когда MATLAB позволяет дублирующиеся имена свойства, смотрите Разделение на подклассы Нескольких Классов (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. Без динамического выделения памяти вы не можете сгенерировать код для классов Handle, которые имеют свойства переменного размера.

  • Чтобы избежать различий в результатах между MATLAB и MEX-функциями, не используйте классы с методами доступа свойства в определенных случаях. См. Методы доступа к свойствам Класса MATLAB, Которые Изменяют Значения свойств (MATLAB Coder).

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

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

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

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

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

    obj.p1.p2 = 1;

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

Если конструктор класса содержит вызов конструктора базового класса, вызов конструктора базового класса должен прибыть перед for, if, return, операторами 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