Я пытаюсь создать узел во время выполнения в моем модуле в Omnet. Я могу создать его с этим кодом, и он работает нормально.
cModule* parentmod = getParentModule();
cModule* grantParentMod = parentmod->getParentModule();
cModule* grantParentMod1 = grantParentMod->getParentModule();
// To check if the module is already created
for (cSubModIterator iter(*grantParentMod1); !iter.end(); iter++)
{
EV << iter()->getFullName()<<endl;
if (iter()->getFullName() == "host_send4")
return;
}
cModuleType *meshnode1 = cModuleType::get("inet.networklayer.manetrouting.PASER.meshnode");
cModule *mod = meshnode1->create("host_send4", grantParentMod1);
cDisplayString& dispstr = getDisplayString();
dispstr.parse("p=1000,535;r=200,green");
mod->finalizeParameters();
mod->buildInside();
mod->scheduleStart(simTime()+2*beaconInterval);
Однако этот модуль не генерируется в нужном месте при выводе симуляции (координаты и дисплей). Я считаю, что отображаемая строка, созданная здесь, не прикреплена к модулю, и, следовательно, я попытался сделать это следующим образом:
cDisplayString& dispstr = getDisplayString();
dispstr.parse("p=1000,535;r=200,green");
mod->getDisplayString().set(dispstr);
Но с этим я сталкиваюсь со следующей ошибкой во время выполнения: — Невозможно получить доступ к отображаемой строке: параметры еще не настроены . Я знаю, что проблема в mod->getDisplayString().set(dispstr);
Так есть ли другой способ назначить параметр, или я делаю небольшую ошибку.
Спасибо за эту помощь.
Убедитесь, что вы выполняете процедуру создания модуля, как указано в OMNeT ++ руководство.
Если вы перейдете к Подробная процедура В подразделе вы увидите исчерпывающий список, в котором указано, какой шаг должен быть выполнен, где
- Найти заводской объект;
- Создать модуль;
- Установите его параметры и размеры ворот по мере необходимости;
- Скажите (возможно, составной) модуль для рекурсивного создания его внутренних подмодулей и соединений;
- Запланируйте активационные сообщения для нового простого модуля.
шаг 3
Я считаю, что вы ищете. Чуть ниже дается подробное объяснение того, что нужно сделать для шага 3
:
Если вы хотите установить значения параметров или размеры вектора затвора (шаг
3.), код идет междуcreate()
а такжеbuildInside()
звонки:// create cModuleType *moduleType = cModuleType::get("foo.nodes.WirelessNode"); cModule *module = moduleType->create("node", this); // set up parameters and gate sizes before we set up its submodules module->par("address") = ++lastAddress; module->finalizeParameters(); module->setGateSize("in", 3); module->setGateSize("out", 3); // create internals, and schedule it module->buildInside(); module->scheduleStart(simTime());
Знать об использовании module->par("<parameter_name>")
функция.
PS: я писал свой ответ, а тем временем вы ответили на свой вопрос. Этот ответ можно оставить для дальнейшего использования, если это будет полезно.
Ну, я изменил код как:
cModuleType *meshnode1 = cModuleType::get("inet.networklayer.manetrouting.PASER.meshnode");
cModule *mod = meshnode1->create("host_send4", grantParentMod1);
mod->finalizeParameters();
std::string displayString = "p=1000,535;r=200,green;i=device/smallrouter";
mod->getDisplayString().parse(displayString.c_str());
mod->buildInside();
mod->scheduleStart(simTime()+2*beaconInterval);
и тогда он работает идеально. Согласно моему пониманию, я должен добавить mod->finalizeParameters();
перед изменением параметров отображения и отображения строка должна быть простой строкой, но не объектом cDisplayString.