Оптимизируйте сгенерированный код для строковых блоков Simulink с помощью стандартных строковых функций библиотеки C++ и строковых объектов. Библиотека строк C++ обеспечивает последовательный код С++ и улучшает функциональные возможности, такие как поиск длины строки, конкатенация, копирование строк, обмен строками, сравнение строк и расчеты подстроки.
В модели matlab: mStrfindSubStr, строковый блок констант, который имеет значение «Hello!», соединяется с str
порт блока String Find. Входной порт соединяется с sub
порт того же блока String Find.
model = 'mStrfindSubStr';
open_system(model);
Во временной папке системы создайте временную папку для процесса сборки и проверки.
currentDir = pwd; [~,cgDir] = rtwdemodir();
В диалоговом окне Параметров конфигурации установите значение параметра Language C++
.
set_param(model, 'TargetLang', 'C++');
В диалоговом окне Параметров конфигурации установите параметр упаковки интерфейса Кода равным C++ class
.
set_param(model, 'CodeInterfacePackaging', 'C++ class');
В диалоговом окне Параметров конфигурации установите параметр Стандартной математической библиотеки равным C++03 (ISO)
.
set_param(model, 'TargetLangStandard', 'C++03 (ISO)');
Создайте модель.
evalc('slbuild(model)');
Просмотрите сгенерированный код с объектами библиотеки строк C++. Вот фрагмент mStrfindSubStr.h
. Код создает экземпляр объекта std: string In1
.
cfile = fullfile(cgDir,'mStrfindSubStr_ert_rtw','mStrfindSubStr.h'); rtwdemodbtype(cfile,'External inputs','External outputs',0,0);
struct ExtU_mStrfindSubStr_T { std::string In1; // '<Root>/In1' };
Просмотрите сгенерированный код с функциями библиотеки строк 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: строка, не поддерживается в симуляциях программа-в-цикле (SIL) и процессор-в-цикле (PIL).