Handlemessage(cMessage * msg)未正确安排

时间:2015-08-22 06:47:19

标签: omnet++

这是第4章第4.10条中omnet ++手册的一个例子。

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

1 个答案:

答案 0 :(得分:0)

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

通常,在有限状态机中,您希望考虑所有允许的不允许的情况,以避免任何未定义的行为。而你在代码中看到的可能是对此的一种衡量标准。

另一方面,如果您在编码方面进行查看 - 只要您有if,最好有else

来自Wikipedia关于有限状态机的文章:

  

......它被设想为一个抽象的机器,可以在一个   有限数量的州。

这意味着应该定义所有可能的状态(即,程序必须处于明确定义的状态)。