【问题标题】:Handlemessage(cMessage *msg) is not properly scheduledHandlemessage(cMessage *msg) 未正确安排
【发布时间】:2015-08-22 06:47:18
【问题描述】:

这是 omnet++ 手册第 4 章第 4.10 条中的示例。

我猜,在handleMessage 方法中,msg 没有正确安排。在case FSM_Exit(active): 状态中显示错误消息。但是消息怎么可能不是startstopburstsendmessage

void wirelessnode::handleMessage(cMessage *msg)
{
FSM_Switch(fsm)
        {
        case FSM_Exit(init):
            FSM_Goto(fsm,sleep);
           break;
    case FSM_Enter(sleep):
            scheduleAt(simTime()+exponential(sleepTimeMean),startstop);
            break;
    case FSM_Exit(sleep):
            scheduleAt(simTime()+exponential(burstTimeMean),startstop);
    if(msg!=startstop)
    {
        error("Invalid event in state ACTIVE in FSM_Exit(sleep) state ");
    }
    FSM_Goto(fsm,active);
    break;
    case FSM_Enter(active):
            scheduleAt(simTime()+exponential(sendIATime),sendmsg);
    break;
    case FSM_Exit(active):
            if(msg==sendmsg)
            {
                FSM_Goto(fsm,snd);
            }
            else if(msg==startstop)
            {
                cancelEvent(sendmsg);
                FSM_Goto(fsm,sleep);
            }
            else
            {   
                error("invalid event in state ACTIVE in FSM_Exit(active) state ");
                //FSM_Goto(fsm,active);
             }
     break;
    case FSM_Exit(snd):
        {
        char msgname[32];
        sprintf(msgname,"job-%d",++i);
        ev <<"Generating"<< msgname <<endl;
        cMessage *job=new cMessage(msgname);
    //    job->SetBitLength ( (long) *msglength );
        job->setTimestamp();
        int gateCount=this->gateSize("radioInOut$o");
        int d=intrand(gateCount);
        send(job,"radioInOut$o",d);
        FSM_Goto(fsm,active);
    break;
          }
    }
 }

【问题讨论】:

    标签: omnet++


    【解决方案1】:

    代码考虑startstopburstsendmessage 以外的事件这一事实并不一定意味着存在另一个事件,但可能存在。

    一般来说,在有限状态机中,您希望考虑所有允许不允许的情况,以避免任何未定义的行为。而您在代码中看到的可能是针对此的一种措施。

    另一方面,如果你从编码的角度来看待它——只要你有一个if,你最好有一个else


    来自关于有限状态机的维基百科文章:

    ...它被认为是一个抽象的机器,它可以在一个 有限数量的状态。

    这意味着应该定义所有可能的状态(即在任何时候程序都必须处于明确定义的状态)。

    【讨论】:

    • 您能告诉我正确的代码顺序还是错误的代码点?
    • 我认为代码序列没有任何问题
    • 那么为什么它检测到错误“在 FSM_Exit(active) 状态下处于 ACTIVE 状态的无效事件”。
      您是否在系统中运行了代码?
      msg 怎么可能既不是 startstop 也不是 sendmsg ?
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多