You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:24:03