在 omnet++ 中到达目的地时无法删除味精?
unable to delete msg when reaches to the destination in omnet++?
我是 OMNeT++ 的新手,我想制作一个简单的广播机制,其中起始节点发送一个消息,它将广播到网状拓扑中连接的所有节点。当 msg 到达目的地时,该 msg 将被删除,不再广播。从 2 天开始,我一直在按照它的官方文档进行研究。我的代码模拟成功。但是当它到达目的地时它不会删除消息。我从只有 25 个节点(计算机)开始,其中源节点是 computer0,目标节点是 computer24。告诉我,我哪里错了。下面是我的源代码:
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class computer : public cSimpleModule
{
protected:
virtual void forwardMessage(cMessage *msg);
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(computer);
void computer::initialize()
{
if (getIndex() == 0) {
char msgname[20];
sprintf(msgname, "msg-%d", getIndex());
cMessage *msg = new cMessage(msgname);
scheduleAt(0.0, msg);
}
}
void computer::handleMessage(cMessage *msg)
{
if (getIndex() == 24) {
EV << "Message " << msg << " arrived.\n";
delete msg;
}
else {
forwardMessage(msg);
}
}
void computer::forwardMessage(cMessage *msg)
{
int n = gateSize("gate");
int k = intuniform(0, n-1);
EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
send(msg, "gate$o", k);
}
模拟快照:https://i.stack.imgur.com/a4JRQ.png
您使用 getIndex()
方法 return 模块在模块数组中的位置。但是,模拟快照显示您不使用模块数组。因此每个模块的 getIndex()
return 都是零。
更正模型的最简单方法是检查模块的名称而不是其位置,例如:
void computer::initialize()
{
// if (getIndex() == 0) {
if (isName("computer0")) {
char msgname[20];
// ...
void computer::handleMessage(cMessage *msg)
{
// if (getIndex() == 24) {
if (isName("computer24")) {
EV << "Message " << msg << " arrived.\n";
// ...
我是 OMNeT++ 的新手,我想制作一个简单的广播机制,其中起始节点发送一个消息,它将广播到网状拓扑中连接的所有节点。当 msg 到达目的地时,该 msg 将被删除,不再广播。从 2 天开始,我一直在按照它的官方文档进行研究。我的代码模拟成功。但是当它到达目的地时它不会删除消息。我从只有 25 个节点(计算机)开始,其中源节点是 computer0,目标节点是 computer24。告诉我,我哪里错了。下面是我的源代码:
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class computer : public cSimpleModule
{
protected:
virtual void forwardMessage(cMessage *msg);
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(computer);
void computer::initialize()
{
if (getIndex() == 0) {
char msgname[20];
sprintf(msgname, "msg-%d", getIndex());
cMessage *msg = new cMessage(msgname);
scheduleAt(0.0, msg);
}
}
void computer::handleMessage(cMessage *msg)
{
if (getIndex() == 24) {
EV << "Message " << msg << " arrived.\n";
delete msg;
}
else {
forwardMessage(msg);
}
}
void computer::forwardMessage(cMessage *msg)
{
int n = gateSize("gate");
int k = intuniform(0, n-1);
EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
send(msg, "gate$o", k);
}
模拟快照:https://i.stack.imgur.com/a4JRQ.png
您使用 getIndex()
方法 return 模块在模块数组中的位置。但是,模拟快照显示您不使用模块数组。因此每个模块的 getIndex()
return 都是零。
更正模型的最简单方法是检查模块的名称而不是其位置,例如:
void computer::initialize()
{
// if (getIndex() == 0) {
if (isName("computer0")) {
char msgname[20];
// ...
void computer::handleMessage(cMessage *msg)
{
// if (getIndex() == 24) {
if (isName("computer24")) {
EV << "Message " << msg << " arrived.\n";
// ...