Omnet++仿真报No Gate Index specified矢量门索引错误如何解决
错误根因
你在NED文件中把node和hub的输出门都定义为了向量类型out[],在C++代码中调用send()函数向向量门发消息时,必须显式指定门的索引,不能只传门名,这就是报错的直接原因。
修复步骤
1. 修改node类的send调用
每个node的out向量门只有1个实例(连接到hub的输入门),固定索引为0,把node::initialize()和node::handleMessage()里所有send(msg, "out");都修改为send(msg, "out", 0);。
修改后相关代码示例:
// initialize里的初始消息发送 send(msg, "out", 0); // 超时重发的消息发送 send(newMsg, "out", 0); // 收到响应后新消息的发送 send(newMsg, "out", 0);
2. 修改hub类的转发逻辑
hub的out也是向量门,需要先获取消息的入站门索引,再指定对应出站门索引发送。如果你需要把消息直接回发给发送节点,修改后代码如下:
void hub::handleMessage(cMessage *msg) { // 获取消息来自哪个节点的入站门索引 int srcNodeIdx = msg->getArrivalGate()->getIndex(); if (uniform(0, 1) < 0.1) { EV << "\"Losing\" message.\n"; bubble("message lost"); delete msg; } else { EV << "Sending back same message as acknowledgement.\n"; // 指定对应节点的出站门索引发送 send(msg, "out", srcNodeIdx); } }
如果你需要实现“节点发消息到hub,hub转发给其他所有节点”的逻辑,还需要补充遍历节点的代码:
void hub::handleMessage(cMessage *msg) { int srcNodeIdx = msg->getArrivalGate()->getIndex(); int nodeCount = getParentModule()->par("n"); if (uniform(0, 1) < 0.1) { EV << "\"Losing\" message.\n"; bubble("message lost"); delete msg; return; } // 转发给除了发送方之外的所有节点 for (int i = 0; i < nodeCount; i++) { if (i != srcNodeIdx) { send(msg->dup(), "out", i); } } delete msg; }
改完之后重新编译运行即可解决报错。
内容的提问来源于stack exchange,提问作者Anoynomy
相关产品推荐
相关产品推荐

