已使用版本: OMNeT ++ 5.0 , iNET 3.4.0
我创建了一些代码,在“逐步”或“动画”模拟模式下为我提供了可靠的结果。当我改为“快速”或“快速”模式时,它会变得越来越糟糕。以下简化示例将解释我的问题:
void MyMacSlave::handleSelfMessage(cMessage *msg)
{
if (msg == CheckAck) {
std::cout << “CheckAck: “ << msg << std::endl;
}
if (msg == transmissionAnnouncement) {
std::cout << “transmissionAnncouncement: “ << msg << std::endl;
}
if (msg == transmissionEvent) {
std::cout << “transmissionEvent: “ << msg << std::endl;
}
delete msg;
}
有一个函数,用于处理自我消息。根据我得到的自我消息,我需要运行不同的查询。
我在逐步或动画模式下得到正确的输出:
CheckAck: (omnetpp::cMessage)CheckAck
transmissionAnncouncement: (omnetpp::cMessage)transmissionAnncouncement
transmissionEvent: (omnetpp::cMessage)transmissionEvent
这是我使用快速或快速模式获得的奇怪输出:
CheckAck: (omnetpp::cMessage)CheckAck
transmissionAnncouncement: (omnetpp::cMessage)transmissionAnncouncement
transmissionAnncouncement: (omnetpp::cMessage)transmissionEvent
transmissionEvent: (omnetpp::cMessage)transmissionEvent
第三个输出行显示自我消息为“ transmissionEvent ”,但'if(msg == transmissionAnnouncement)'被错误地视为真实
如上图所示,根据我使用的模拟模式,我会得到不同的模拟结果。产量不同的原因是什么?为什么会有差异呢?
答案 0 :(得分:0)
Christoph和Rudi提到内存分配有问题。当指针被解除分配并且在同一存储器上分配新指针时,会出现问题。关于不同运行模式的使用的差异只是表明存在这种效果的错误。
在我的情况下,检查消息类型(如
)很有用 if (msg->getKind() == checkAckAckType) {
而不是原始qeustion中使用的方法。我使用简单的枚举来定义消息类型。