【问题标题】:cMessage tag disappears when message leaves compound module消息离开复合模块时cMessage标签消失
【发布时间】:2021-06-10 16:26:19
【问题描述】:

考虑一下:我有一个开关(灰色方块),它是一个复合模块。在这个开关内部,还有更多的复合模块。基本上有3层复合模块,绿色圆角方块里面是简单模块。

我的问题出现在绿色圆形模块内。我创建一个标签并将其分配给到达第一个绿色模块的每个帧。然后由第一个绿色模块内的其他简单模块完成其他一些处理步骤(基于标签中包含的信息)。现在,当离开第一个绿色复合模块并进入第二个(红色箭头)时,不知何故我的标签和它的所有信息都丢失了。

我在第一个绿色模块中添加标签,如下所示:

void filterPrep::handleMessage(cMessage* msg){
     if(msg->isSelfMsg()){

     }
     else{
         inet::Packet* packet = check_and_cast<inet::Packet*>(msg);
         FilterTag* tag; 
         tag = packet->addTag<FilterTag>();
         tag->setValue1(someValue); //This works fine
     }
     send(msg, "out");
}

我像这样读取第一个绿色模块中每个简单模块中的标签。这工作正常,但在第二个绿色模块(例如下一个复合模块)中,这会产生 nullptr

void filtering::handleMessage(cMessage* msg){
    if(msg->isSelfMsg()){
    
    }
    else{
        inet::Packet* packet = check_and_cast<inet::Packet*>(msg);
        FilterTag* fetchedTag;
        fetchedTag = packet->getTag<FilterTag>(); // throws exception 
        fetchedTag->getValue1();
   }
}

我不知道为什么会发生这种情况,你能帮帮我吗?

【问题讨论】:

  • 不清楚会发生什么。首先你说一些东西返回一个'nullptr'然后在源代码中也注释了一行它引发了异常?现在发生了哪一个?

标签: c++ omnet++ inet


【解决方案1】:

一个可能的答案是,这确实是合法的。用于获取标记值的代码假定 每条 消息实际上是一个Packet,并且每个消息都有一个与之关联的FilterTag。由于第一个绿色模块是复合模块,因此可能会出现数据包以某种方式在未添加 FilterTag 的路由上传输的情况。这可能是真的,也可能不是。从上面的信息很难判断。所以简而言之,确保生成异常的数据包实际上首先添加了标签。标签没有被删除,而是从一开始就没有添加。您应该调试此行为,因为您的假设(每个数据包都有一个标签)可能不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2015-05-01
    • 2012-09-06
    相关资源
    最近更新 更多