当消息离开复合模块时,cMessage 标签消失

问题描述

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

enter image description here

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

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

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();
   }
}

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

解决方法

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