Чтобы сгенерировать эффективный автономный код для классов MATLAB®, необходимо использовать классы по-другому, запуская код в среде MATLAB.
Что отличается | Больше информации |
---|---|
Ограниченный набор функций языка. | Ограничения языка |
Ограниченный набор функций генерации кода. | Генерация кода показывает не совместимый с классами |
Определение свойств класса. | Определение свойств класса для генерации кода |
Использование классов Handle. | Сгенерируйте код для MATLAB Классы 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
, чтобы объявить класс или метод как внешние.
Вы не можете передать класс MATLAB coder.ceval
. Можно передать свойства класса coder.ceval
.
Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является Системой object™ свойство с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для Некоторых Свойств.
Если объект имеет дублирующиеся имена свойства, и генератор кода пробует к постоянному сгибу объект, генерация кода может перестать работать. Постоянные сгибы генератора кода объект, когда это используется с coder.Constant
или coder.const
, или когда это - вход к или выведенный от постоянно свернутой внешней функции.
Дублирующиеся имена свойства происходят в объекте подкласса в этих ситуациях:
Подкласс имеет свойство с тем же именем как свойство суперкласса.
Подкласс выводит от нескольких суперклассов, которые используют то же имя для свойства.
Для получения информации о том, когда MATLAB позволяет дублирующиеся имена свойства, смотрите Разделение на подклассы Нескольких Классов (MATLAB).
Для генерации кода необходимо задать свойства класса по-другому, чем вы делаете при выполнении кода в среде MATLAB:
MEX-функции сообщают об ошибках тот результат валидации свойства. Автономный код C/C++ сообщает об этих ошибках, только если вы включаете создание отчетов ошибки времени выполнения. Смотрите Обнаружение Ошибки времени выполнения и Сообщающий в Автономном Коде C/C++. Прежде чем вы сгенерируете автономный код C/C++, это - лучшая практика протестировать валидацию свойства путем выполнения 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, Которые Изменяют Значения свойств.
Если свойство является постоянным, и его значение является объектом, вы не можете изменить значение свойства того объекта. Например, предположите что:
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. Например, вы не можете сгенерировать код для следующего класса:
classdef myclass < double