首页 > 解决方案 > 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 文件。

我该如何解决这个问题?提前致谢。

标签: omnet++

解决方案


在行中:

int sid = msg->getArrivalGateId();

您阅读了登机口 ID。然后将此值用作门索引

send(updated, "out", sid);

但是,门 ID 与门索引不同。因此在send().
在模拟中,每个对象(例如模块、门、消息)都有一个唯一的编号(即 ID)。OMNeT++ Simulation Library中明确提到了这一点 。
您应该检查门的当前大小,并确保不要尝试通过索引发送超出范围。


推荐阅读