Ошибка — пока не удается получить доступ к отображаемой строке для создания нового узла в Omnet

Я пытаюсь создать узел во время выполнения в моем модуле в 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);
Так есть ли другой способ назначить параметр, или я делаю небольшую ошибку.
Спасибо за эту помощь.

0

Решение

Убедитесь, что вы выполняете процедуру создания модуля, как указано в OMNeT ++ руководство.

Если вы перейдете к Подробная процедура В подразделе вы увидите исчерпывающий список, в котором указано, какой шаг должен быть выполнен, где

  1. Найти заводской объект;
  2. Создать модуль;
  3. Установите его параметры и размеры ворот по мере необходимости;
  4. Скажите (возможно, составной) модуль для рекурсивного создания его внутренних подмодулей и соединений;
  5. Запланируйте активационные сообщения для нового простого модуля.

шаг 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: я писал свой ответ, а тем временем вы ответили на свой вопрос. Этот ответ можно оставить для дальнейшего использования, если это будет полезно.

3

Другие решения

Ну, я изменил код как:

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.

1

По вопросам рекламы [email protected]