2

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声明は最善の方法ですか?

4

2 に答える 2

1

現在いる場所のすぐ下の状態を常に実行したい場合は、breakステートメントを削除できます。/* fall through */フォローしている人や未来を忘れる自分に意図的に欠けていることが明確になるように、その場所にコメントを入れます。私は個人的にこの方法が好きではありません。

state変数を変更してgotoから、switch ステートメントのすぐ上にある a を実行してみませんか? このように多分:

switchStart:
    switch (state)
    {
        case START:
            printf("Simple Chat Client - START state\n");
            if (argv[1] != NULL)
            {
                SEND_CONN_REQ();
                state = STATE_HERE; // change your state
                goto switchStart; // jump to the top of the switch
                } 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;
    }
于 2013-10-20T03:44:35.917 に答える