我有下面的代碼來定義我的FSM狀態:跳轉
enum states
{
START, // Send request to remote IP or wait for a request (WAIT_CONN_REQ)
WAIT_RESP, // Chat request sent to remote IP. Waiting for a response from the target machine
SEND_CONN_RESP, // Chat request received from remote IP. ACCEPT or REJECT
ACCEPTED // Both parties agreed to exchange datagrams. Begin application data (MESSAGES) exchange
};
typedef enum states states;
states state;
我的思維過程是這樣的:我的聊天程序將具有上述四種狀態。整潔地做這件事的最好方法是什麼?當然使用switch語句。那我該怎麼做呢?像這樣的:(代碼簡化&與printf
功能」
int main(int argc, char *argv[])
{
state = START;
switch (state)
{
case START:
printf("Simple Chat Client - START state\n");
if (argv[1] != NULL)
{
SEND_CONN_REQ();
} else {
WAIT_CONN_REQ();
}
break;
case WAIT_RESP:
printf("WAIT_RESP STATE!");
break;
case SEND_CONN_RESP:
printf("SEND_CONN_RESP state!");
break;
case ACCEPTED:
printf("ACCEPTED state!");
break;
}
}
但這並不做我想我需要在條件滿足就跳轉到另一種情況下,像這樣什麼代替:。
if (argv[1] != NULL)
{
SEND_CONN_REQ();
goto case WAIT_RESP;
} else {
WAIT_CONN_REQ();
}
break;
case WAIT_RESP:
printf("WAIT_RESP STATE!");
break;
我的邏輯告訴我,要做到這一點的辦法是改變state
變量,假定整個switch
將與新的變量再次執行。但是,什麼情況是,我必須要麼使用break
和退出switch
,或者不使用它並讓程序執行下一個case
。
所以我看了其他選項,如do
報表和continue
。但在我看來,使用case
似乎是與FSM一起使用的方式。
我將不勝感激關於如何正確執行此操作的任何幫助。是一個switch
聲明甚至是最好的方式?
您的switch語句是靜音的。任何請不要使用goto –
@EdHeal嘿! - 我知道'goto'不好,永遠不要使用,我只把它放在那裏,以便傳達我的意思。但是,謝謝你的建議!你能解釋一下「靜音」的含義嗎? – user2899235
您設置了'state',然後在'switch'語句中使用它。即如果對於它將去的路線是否是一個放棄的結論。它也在'main'功能 –