Устранение ошибки: генератору кода не удалось произвести деструктор C++ для класса MATLAB

Проблема

Генерация повторного кода с классами C++ из MATLAB® код увеличивает шансы переполнения стека во время выполнения кода. Генерация кода может остановиться и создать это сообщение:

Code generator failed to produce C++ destructor for MATLAB class 'y'. Generated code is not exception-safe. To enable generation of C++ destructor, disable 'Generate Re-entrant code (MultiInstanceCode)' configuration parameter.

Это сообщение может появиться, если оба условия верны:

  • Вы принимаете решение сгенерировать код С++ с классами из кода MATLAB путем установки TargetLang на 'C++CppPreserveClasses на true в объекте строения (coder.CodeConfig или coder.EmbeddedCodeConfig), или в настройках сборки проекта, путем установки Language равной C++и установка флажка Generate C++ classes from MATLAB classes.

  • Вы принимаете решение сгенерировать повторный код путем включения MultiInstanceCode параметр в объекте строения кода или путем включения параметра Generate re-entrant code на вкладке Memory приложения MATLAB Coder™.

  • Деструктор класса в коде MATLAB имеет постоянную переменную или вызывает другую функцию, которая объявляет и использует постоянную переменную.

Возможные решения

В зависимости от типа кода, который вы хотите сгенерировать, попробуйте одно из следующих решений.

Увеличение пределов стека

Можно увеличить предел стека, чтобы сгенерировать повторный код, который имеет классы C++ для классов MATLAB. Выполните одно из следующих действий:

  • В диалоговом окне настроек проекта под вкладкой Memory установите параметр Stack usage max.

  • В объекте строения для автономной генерации кода (coder.CodeConfig или coder.EmbeddedCodeConfig), установите StackUsageMax параметр.

Увеличьте предел стека путем удвоения значения стека, пока генерация кода не преуспеет. Генератор кода может иметь достаточную память, чтобы сгенерировать классы C++ в повторно входящем коде.

Примечание

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

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

Отключить входящий код

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

  • В объекте строения кода отключите MultiInstanceCode параметр.

  • В приложении MATLAB Coder отключите параметр Generate re-entrant code.

Сгенерируйте структуры вместо классов

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

  • В объекте строения для автономной генерации кода (coder.CodeConfig или coder.EmbeddedCodeConfig), установите TargetLang на 'C++CppPreserveClasses на false.

  • В приложении MATLAB Coder установите Language равным C++. В настройках сборки проекта снимите флажок Generate C++ classes from MATLAB classes.

Похожие темы