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;
私の思考プロセスは次のとおりです。私のチャット プログラムには、前述の 4 つの状態があります。これをきれいに行うための最良の方法は何ですか?もちろん、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
声明は最善の方法ですか?