【问题标题】:Omnet++ No Gate Index specified when accessing vector gateOmnet++ 访问向量门时未指定门索引
【发布时间】:2021-12-21 03:01:42
【问题描述】:

我询问的是环形拓扑网络,我希望将消息从节点发送到集线器,然后发送到另一个节点,然后返回集线器,但是当它模拟时会弹出一个错误。我不确定是什么问题。

send()/sendDelayed(): No gate index specified when accessing vector gate 'out' -- in module (node) Startop.node[0] (id=2), during network initialization

这是我的 .ned 文件:

package startop;

simple node
{
    parameters:
        @display("i=device/pc2_s");
    gates:
        input in[];
        output out[];
}

simple hub
{
    parameters:
        @display("i=device/switch");
    gates:
        input in[];
        output out[];
}

network Startop
{
    parameters:
        int n @prompt("Number of stations") = default(2);
    submodules:
        node[n]: node;
        hub: hub {
            @display("p=222,170");
        }
    connections allowunconnected:
        for i=0..n-1 {
            node[i].out++ --> hub.in++;
            hub.out++ --> node[i].in++;
        }
}

这是 .cc 文件:

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

class node : public cSimpleModule
{
  private:
    simtime_t timeout;  // timeout
    cMessage *timeoutEvent;  // holds pointer to the timeout self-message

  public:
    node();
    virtual ~node();

  protected:
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(node);

node::node()
{
    timeoutEvent = nullptr;
}

node::~node()
{
    cancelAndDelete(timeoutEvent);
}

void node::initialize()
{
    // Initialize variables.
    timeout = 1.0;
    timeoutEvent = new cMessage("timeoutEvent");

    // Generate and send initial message.
    EV << "Sending initial message\n";
    cMessage *msg = new cMessage("StarMsg");
    send(msg, "out");
    scheduleAt(simTime()+timeout, timeoutEvent);
}

void node::handleMessage(cMessage *msg)
{
    if (msg == timeoutEvent) {
        // If we receive the timeout event, that means the packet hasn't
        // arrived in time and we have to re-send it.
        EV << "Timeout expired, resending message and restarting timer\n";
        cMessage *newMsg = new cMessage("StarMsg");
        send(newMsg, "out");
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
    else {  // message arrived
            // Acknowledgement received -- delete the received message and cancel
            // the timeout event.
        EV << "Timer cancelled.\n";
        cancelEvent(timeoutEvent);
        delete msg;

        // Ready to send another one.
        cMessage *newMsg = new cMessage("starMsg");
        send(newMsg, "out");
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
}

class hub : public cSimpleModule
{
  protected:
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(hub);

void hub::handleMessage(cMessage *msg)
{
    if (uniform(0, 1) < 0.1) {
        EV << "\"Losing\" message.\n";
        bubble("message lost");  // making animation more informative...
        delete msg;
    }
    else {
        EV << "Sending back same message as acknowledgement.\n";
        send(msg, "out");
    }
}

我可以知道如何解决这个问题吗?

【问题讨论】:

    标签: omnet++


    【解决方案1】:

    问题正是错误消息所说的。 NED 文件在node 和hub 中定义了out 门向量:

    output out[];
    

    但是,您的 c++ 代码始终使用发送方法 send(msg, "out"),而没有指定应该使用 which out 门。即它从不指定索引。为此,您必须使用 send(msg, "out", getIndex)。

    【讨论】:

    • 感谢您的帮助,非常感谢。
    • 但是添加getIndex函数后还是报同样的错误?
    • 所以...您的代码中仍有send() 调用未指定索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    相关资源
    最近更新 更多