我的 omnet++ 模拟卡在一个循环中
My omnett++ simulation is stuck in a loop
每当我 运行 我的模拟时,最初在 rdrchk1 上创建的消息卡在两者之间
rdrchk1 和 rdrsucess1。
这是我的 C++ 代码:
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class rdr : public cSimpleModule
{
protected:
// The following redefined virtual function holds the algorithm.
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
// The module class needs to be registered with OMNeT++
Define_Module(rdr);
void rdr::initialize()
{
int v1 = rand() % 100;
int v2 = rand() % 100;
int v3 = rand() % 100;
if (strcmp("rdrchk1", getName()) == 0) {
cMessage *msg = new cMessage("objectcheck");
if (v1<78|| v2 < 82 || v3 <69){
int n = 0;
send(msg, "out", n);
}
else{
int d=1;
send(msg, "out", d);
}
}
}
void rdr::handleMessage(cMessage *msg)
{
int t = 0;
send(msg, "out",t);
}
这是我的 NED 代码:
simple rdr
{
parameters:
@display("i=block/routing");
gates:
input in[4];
output out[4];
}
//
network radr
{
@display("bgb=356,232");
submodules:
rdrchk1: rdr {
@display("p=85,67");
}
rdrfail1: rdr {
@display("p=275,133;i=block/wheelbarrow");
}
rdrsucess1: rdr {
@display("p=291,61");
}
connections allowunconnected:
rdrchk1.out[1] --> rdrfail1.in++;
rdrchk1.out[0] --> rdrsucess1.in++;
rdrchk1.in[2] <-- rdrfail1.out++;
rdrchk1.in[3] <-- rdrsucess1.out++;
}
我知道它被卡住了,因为每当我编辑我的代码以保证它下一步会转到 rdrfail1 时,它就会卡在 rdrchk1 和 rdrsucess1 之间。任何人都可以告诉我为什么这样做以及我可以做些什么来解决它。谢谢你的时间。
这是您的模型中发生的情况。
在 rdrchk1
的 initialize()
中创建了一条新消息。然后发送该消息:
一种。当条件 if (v1<78|| v2 < 82 || v3 <69)
为真时 rdrsucess1
或
b.到 rdrfail1
否则
如果rdrsucess1
收到消息,它会立即将该消息发送到rdrchk1
(因为在您的网络端口中,索引为out
的rdrsucess1
连接到 rdrchk1
).
如果rdrfail1
收到消息,它会立即将该消息发送到rdrchk1
(因为在您的网络端口中,索引为out
的rdrfail1
连接到 rdrchk1
).
然后rdrchk1
收到消息并立即发送给rdrsucess1
。
然后第2点和第4点无限重复
每当我 运行 我的模拟时,最初在 rdrchk1 上创建的消息卡在两者之间 rdrchk1 和 rdrsucess1。 这是我的 C++ 代码:
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
class rdr : public cSimpleModule
{
protected:
// The following redefined virtual function holds the algorithm.
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
// The module class needs to be registered with OMNeT++
Define_Module(rdr);
void rdr::initialize()
{
int v1 = rand() % 100;
int v2 = rand() % 100;
int v3 = rand() % 100;
if (strcmp("rdrchk1", getName()) == 0) {
cMessage *msg = new cMessage("objectcheck");
if (v1<78|| v2 < 82 || v3 <69){
int n = 0;
send(msg, "out", n);
}
else{
int d=1;
send(msg, "out", d);
}
}
}
void rdr::handleMessage(cMessage *msg)
{
int t = 0;
send(msg, "out",t);
}
这是我的 NED 代码:
simple rdr
{
parameters:
@display("i=block/routing");
gates:
input in[4];
output out[4];
}
//
network radr
{
@display("bgb=356,232");
submodules:
rdrchk1: rdr {
@display("p=85,67");
}
rdrfail1: rdr {
@display("p=275,133;i=block/wheelbarrow");
}
rdrsucess1: rdr {
@display("p=291,61");
}
connections allowunconnected:
rdrchk1.out[1] --> rdrfail1.in++;
rdrchk1.out[0] --> rdrsucess1.in++;
rdrchk1.in[2] <-- rdrfail1.out++;
rdrchk1.in[3] <-- rdrsucess1.out++;
}
我知道它被卡住了,因为每当我编辑我的代码以保证它下一步会转到 rdrfail1 时,它就会卡在 rdrchk1 和 rdrsucess1 之间。任何人都可以告诉我为什么这样做以及我可以做些什么来解决它。谢谢你的时间。
这是您的模型中发生的情况。
在
rdrchk1
的initialize()
中创建了一条新消息。然后发送该消息:
一种。当条件if (v1<78|| v2 < 82 || v3 <69)
为真时rdrsucess1
或
b.到rdrfail1
否则如果
rdrsucess1
收到消息,它会立即将该消息发送到rdrchk1
(因为在您的网络端口中,索引为out
的rdrsucess1
连接到rdrchk1
).如果
rdrfail1
收到消息,它会立即将该消息发送到rdrchk1
(因为在您的网络端口中,索引为out
的rdrfail1
连接到rdrchk1
).然后
rdrchk1
收到消息并立即发送给rdrsucess1
。
然后第2点和第4点无限重复