Оптимизируйте сгенерированный код для блоков строки 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)');
Создайте модель.
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);
Ограничения:
Массив шины, которая содержит std:string, не поддержан в симуляциях процессора в цикле (PIL) и программном обеспечении в цикле (SIL).