मैं अपने विशिष्ट कोड पता नहीं है, लेकिन वहाँ एक कारण कुछ है इस तरह:
typedef enum {
STATE1, STATE2, STATE3
} myState_e;
void myFsm(void)
{
myState_e State = STATE1;
while(1)
{
switch(State)
{
case STATE1:
State = STATE2;
break;
case STATE2:
State = STATE3;
break;
case STATE3:
State = STATE1;
break;
}
}
}
आपके लिए काम नहीं करेगा? यह goto
का उपयोग नहीं करता है, और यह अपेक्षाकृत आसान है।
संपादित करें: सभी उन State =
टुकड़े सूखी उल्लंघन करते हैं, तो मैं बजाय की तरह कुछ कर सकता:
typedef int (*myStateFn_t)(int OldState);
int myStateFn_Reset(int OldState, void *ObjP);
int myStateFn_Start(int OldState, void *ObjP);
int myStateFn_Process(int OldState, void *ObjP);
myStateFn_t myStateFns[] = {
#define MY_STATE_RESET 0
myStateFn_Reset,
#define MY_STATE_START 1
myStateFn_Start,
#define MY_STATE_PROCESS 2
myStateFn_Process
}
int myStateFn_Reset(int OldState, void *ObjP)
{
return shouldStart(ObjP) ? MY_STATE_START : MY_STATE_RESET;
}
int myStateFn_Start(int OldState, void *ObjP)
{
resetState(ObjP);
return MY_STATE_PROCESS;
}
int myStateFn_Process(int OldState, void *ObjP)
{
return (process(ObjP) == DONE) ? MY_STATE_RESET : MY_STATE_PROCESS;
}
int stateValid(int StateFnSize, int State)
{
return (State >= 0 && State < StateFnSize);
}
int stateFnRunOne(myStateFn_t StateFns, int StateFnSize, int State, void *ObjP)
{
return StateFns[OldState])(State, ObjP);
}
void stateFnRun(myStateFn_t StateFns, int StateFnSize, int CurState, void *ObjP)
{
int NextState;
while(stateValid(CurState))
{
NextState = stateFnRunOne(StateFns, StateFnSize, CurState, ObjP);
if(! stateValid(NextState))
LOG_THIS(CurState, NextState);
CurState = NextState;
}
}
जो निश्चित रूप से है, बहुत लंबे समय तक पहला प्रयास (सूखी के बारे में अजीब बात) की तुलना में,। लेकिन यह भी अधिक मजबूत है - राज्य कार्यों में से किसी एक से राज्य को वापस करने में विफलता के परिणामस्वरूप पहले कोड में गायब State =
को चुपचाप अनदेखा करने के बजाय संकलक चेतावनी होगी।
स्रोत
2010-06-23 21:42:22
ए को लिंक करना होगा: http://xkcd.com/292/ –
मैं उत्सुक हूं। क्या आप पहले गोटो/कोड के गोटो स्नैपशॉट के बाद पोस्ट कर सकते हैं? –
हम आपके मालिक को नहीं जानते हैं और उसके पास क्या पूर्वाग्रह हैं, इसलिए यदि आप चालाक देखना चाहते हैं, तो फ़ंक्शन पॉइंटर्स का उपयोग करें (यहां अन्य प्रश्नों का मेरा उत्तर देखें: http://stackoverflow.com/questions/1371460/state-machines- ट्यूटोरियल/1371654 # 1371654) – qrdl