omnet++ - Omnet++ 门索引超出范围
问题描述
我正在创建一个随机生成的网络,在询问其他节点是否已经知道更新后,节点将发送更新消息。目前更新状态仍然是预定义的。运行模拟时收到此错误消息:
send()/sendDelayed(): Gate index 1048576 out of range when accessing vector gate 'out[]' with size 1 -- in module (Sg1) Simplegossip1.node[2] (id=4), at t=0s event #1
这是我的代码:
simplegossip1.ned
simple Sg1
{
parameters:
@display("i=block/routing");
bool updated;
gates:
input in[]; // declare in[] and out[] to be vector gates
output out[];
}
network Simplegossip1
{
parameters:
int count;
double connectedness; // 0.0<x<1.0
@display("bgb=640,444");
submodules:
node[count]: Sg1 {
gates:
in[]; // removed the size of gate
out[];
}
connections allowunconnected:
for i=0..count-2, for j=i+1..count-1, if uniform(0,1)<connectedness {
node[i].out++ --> node[j].in++;
node[i].in++ <-- node[j].out++;
}
}
这是cc文件。sg1.cc
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
/**
* First attempt for gossip protocol
*/
class Sg1 : public cSimpleModule
{
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(Sg1);
void Sg1::initialize()
{
if (getIndex() == 0) {
cMessage *askupdated = new cMessage("Ask Update");
int m = gateSize("out");
int l = intuniform(0, m-1);
send(askupdated, "out",l);
}
}
void Sg1::handleMessage(cMessage *msg)
{
//gate randomizer
int n = gateSize("out");
int k = intuniform(0, n-1);
int sid = msg->getArrivalGateId();
bool updatestatus = par("updated");
EV << "Received message `" << msg->getName() << "', sending it out again\n";
if (strncmp (msg->getName(),"Ask Update",2) == 0) {
if (updatestatus == true){
delete msg;
cMessage *updated = new cMessage("Updated");
send(updated, "out", sid);
}
else {
delete msg;
cMessage *unupdated = new cMessage("Unupdated");
send(unupdated, "out", sid);
}
}
else if (strncmp (msg->getName(),"Unupdated",2) == 0) {
delete msg;
cMessage *update = new cMessage("Here is the update");
send(update, "out", sid);
}
else {
delete msg;
cMessage *askupdated = new cMessage("Ask Update");
send(askupdated, "out", sid);
}
}
还有一个只调用 Simplegossip1 网络的 omnet.ini 文件。
我该如何解决这个问题?提前致谢。
解决方案
在行中:
int sid = msg->getArrivalGateId();
您阅读了登机口 ID。然后将此值用作门索引:
send(updated, "out", sid);
但是,门 ID 与门索引不同。因此在send()
.
在模拟中,每个对象(例如模块、门、消息)都有一个唯一的编号(即 ID)。OMNeT++ Simulation Library中明确提到了这一点
。
您应该检查门的当前大小,并确保不要尝试通过索引发送超出范围。
推荐阅读
- c - 有人可以解释这个scanf代码的含义吗
- javascript - JS - 将键附加到匹配的数组、对象值
- java - 从 JAVA 运行 TCL 脚本
- javascript - 使用 npm 进行不可复制的安装
- jakarta-ee - 两个相似的网页,使用一个/两个控制器?为什么?
- firebase - Firestore:userId 规则
- c# - 在我通过 IActionResult 从我的 Asp Net Core 项目将 XML 数据返回到 html 后,为什么符号 ω 看起来像 ╧ë?
- excel - ActiveWorkbook.SaveAs
- wordpress - 当我们在 word press 登录时,是否有任何功能或插件可以在 laravel 中登录用户
- python - 捕获 HTML 表单提交操作和打印响应之间的时间