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


person Peter    schedule 01.05.2015    source источник


Ответы (2)


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

person user4786271    schedule 03.05.2015

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

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.

person Peter    schedule 03.05.2015