这是第4章第4.10条中omnet ++手册的一个例子。
在handleMessage
方法中,msg
未正确安排,我猜。在case FSM_Exit(active):
状态中显示错误消息。但该消息怎么可能不是startstopburst
和sendmessage
?
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;
}
}
}
答案 0 :(得分:0)
代码考虑startstopburst
和sendmessage
以外的事件这一事实并不一定意味着有另一个事件,但可能有一个事件。
通常,在有限状态机中,您希望考虑所有允许的和不允许的情况,以避免任何未定义的行为。而你在代码中看到的可能是对此的一种衡量标准。
另一方面,如果您在编码方面进行查看 - 只要您有if
,最好有else
来自Wikipedia关于有限状态机的文章:
......它被设想为一个抽象的机器,可以在一个 有限数量的州。
这意味着应该定义所有可能的状态(即,程序必须处于明确定义的状态)。