错误-无法访问Omnet中创建新节点的显示字符串

Error - Cannot access display string yet for new node creation in Omnet

本文关键字:节点 字符串 显示 新节点 创建 访问 Omnet 错误      更新时间:2023-10-16

我正试图在运行时在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++手册中给出的模块创建过程。

如果导航到详细程序子部分,您将注意到一个全面的列表,该列表告诉应在何处执行哪个步骤:

  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>")函数的用法。

附言:我在写我的答案,同时你也回答了你自己的问题。如果有用的话,这个答案可以留作参考。

我把代码修改为:-

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