0

我正在尝试在运行时在 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); 所以还有其他方法可以分配参数还是我做一些小错误。感谢您的帮助。

4

2 回答 2

3

确保您遵循 OMNeT++手册中给出的模块创建过程。

如果您导航到“详细程序”子部分,您会注意到一个完整的列表,其中说明应在何处执行哪些步骤:

  1. 找到工厂对象;
  2. 创建模块;
  3. 根据需要设置其参数和浇口尺寸;
  4. 告诉(可能是复合的)模块递归地创建其内部子模块和连接;
  5. 为新的简单模块安排激活消息。

步骤3我相信是您正在寻找的那个。下面是对 step 应该做什么的详细解释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:我正在写我的答案,同时你回答了你自己的问题。如果有用,可以将这个答案留在那里以供将来参考。

于 2015-05-03T14:32:15.890 回答
1

好吧,我将代码修改为:-

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 对象。

于 2015-05-03T14:16:24.500 回答