Оптимизируйте сгенерированный код для блоков строки Simulink при помощи стандартных строковых функций библиотеки C++ и представьте объекты в виде строки. Библиотека строки C++ предоставляет сопоставимый Код С++ и улучшает функциональность, такую как извлечение длины строки, конкатенация, копия строки, свопинг строки, сравнение строк и расчеты подстроки.
В модели matlab:mStrfindSubStr, блок строковой константы, который имеет значение "Привет!" подключения к str
порт блока String Find. Импорт соединяется с sub
порт того же блока String Find.
model = 'mStrfindSubStr';
open_system(model);
Во временной папке вашей системы создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
В диалоговом окне Configuration Parameters, установленном параметр Языка на C++
.
set_param(model, 'TargetLang', 'C++');
В диалоговом окне Configuration Parameters, установленном интерфейс Code упаковочный параметр на C++ class
.
set_param(model, 'CodeInterfacePackaging', 'C++ class');
В диалоговом окне Configuration Parameters, установленном Стандартный математический параметр библиотеки на C++03 (ISO)
.
set_param(model, 'TargetLangStandard', 'C++03 (ISO)');
Через пользовательский интерфейс или в командной строке, установленной эти параметры:
Выключите динамическое выделение памяти Использования для инстанцирования блока модели.
Выключите динамическое выделение памяти Использования для инициализации модели.
Включите Удаляют корневую нулевую инициализацию ввода-вывода уровня.
Включите Удаляют внутреннюю нулевую инициализацию данных.
set_param(model, 'UseOperatorNewForModelRefRegistration', 'off'); set_param(model, 'GenerateAllocFcn', 'off'); set_param(model, 'ZeroExternalMemoryAtStartup', 'off'); set_param(model, 'ZeroInternalMemoryAtStartup', 'off');
Создайте модель.
evalc('rtwbuild(model)');
Просмотрите сгенерированный код с объектами библиотеки строки C++. Вот фрагмент mStrfindSubStr.h
. Код инстанцирует std:string объекта In1
.
cfile = fullfile(cgDir,'mStrfindSubStr_ert_rtw','mStrfindSubStr.h'); rtwdemodbtype(cfile,'External inputs','External outputs',0,0);
typedef struct { std::string In1; // '<Root>/In1' } ExtU_mStrfindSubStr_T;
Просмотрите сгенерированный код с библиотечными функциями строки C++. Вот фрагмент mStrfindSubStr.cpp
. Код использует find
функция, чтобы искать первое символьное соответствие, которое присутствует в библиотеке строки C++.
cfile = fullfile(cgDir,'mStrfindSubStr_ert_rtw','mStrfindSubStr.cpp'); rtwdemodbtype(cfile,'Model step function','Model initialize function',0,0);
void untitled1ModelClass::step() { uint32_T tmpOut; // StringFind: '<Root>/String Find' incorporates: // Inport: '<Root>/In1' // StringConstant: '<Root>/String Constant' tmpOut = mStrfindSubStr_P.StringConstant_String.find(mStrfindSubStr_U.In1); if (tmpOut == (uint32_T)std::string::npos) { // Outport: '<Root>/Out1' mStrfindSubStr_Y.Out1 = -1; } else { // Outport: '<Root>/Out1' mStrfindSubStr_Y.Out1 = static_cast<int32_T>(tmpOut) + 1; } // End of StringFind: '<Root>/String Find' }
Этот код выполняется быстрее и легче читать. Закройте модель и отчет генерации кода.
bdclose(model); rtwdemoclean; cd(currentDir);
Примечание: Прежде, чем выбор корневой ввод-вывод уровня Remove обнуляют инициализацию и Удаляют внутренние параметры инициализации данных, подтверждают, что ваша модель отвечает следующим условиям:
Если ваш компилятор не совместим стандартами, подтвердите, что он инициализирует глобальные данные, чтобы обнулить.
Подтвердите, что данные или статически выделяются или что динамически выделенные данные инициализируются, чтобы обнулить.
Ограничения:
1. Массив шины, которая содержит std:string, не поддержан в симуляциях процессора в цикле (PIL) и программном обеспечении в цикле (SIL).
2. Генерация кода, которая пользуется std:string библиотекой, не работает, и сгенерированный код использует C
char_T
массивы, если:
Динамическое выделение памяти Использования для параметра инициализации модели включено.
Динамическое выделение памяти Использования для параметра инстанцирования блока модели включено.
Удалить корневой нулевой параметр инициализации ввода-вывода уровня отключен в диалоговом окне параметров конфигурации.
Удалять внутренний нулевой параметр инициализации данных отключено в диалоговом окне параметров конфигурации.
3. Все вышеупомянутые параметры должны соответствовать промежуточный модель и любая модель, на которую ссылаются, которая может присутствовать.