1

シリアルポートデバイスと通信していて、そのようなデバイスを制御するためのコマンドがかなりの数 (74) あるとします。それらを保存して使用する最良の方法はどれですか?

もちろん、次の方法でそれらを整理できます。

static char *cmd_msgs[] =
{
    "start",
    "stop",
    "reset",
    "quit",
    "",
    "",
    "",
    "",
    ...
};

または人間が読める形式:

char cmd_start_str[] = "start";
...
char cmd_quit_str[] = "quit";

誰かがそのようなタスクを扱う実例を指摘できますか?

4

3 に答える 3

5

最初のアプローチは問題ありません。一意の名前を持つグローバル変数を多く使用しないでください。特に、それらをループしたい場合に参照するのは困難です。それが文字列の配列の目的です(最初の方法)。人間が読めるコードが必要な場合 (必要な場合)、値が実際のコマンド文字列に対応する適切な名前の列挙を使用します。だから次のようなことをしてください

const char *cmds[] = {
    "command 1",
    "command 2",
    "Print Hello World",
    "Explode House"
};

enum {
    COMMAND_ONE,
    COMMAND_TWO,
    COMMAND_SAYHELLO,
    COMMAND_BOOM
};

このようにして、配列にインデックスを付けることでコマンドを簡単に参照できますが、書き込みcmds[COMMAND_SAYHELLO]などによって読みやすくなります。

于 2012-08-26T09:24:04.743 に答える
1

最初のオプションを使用する場合、通常、配列内の各文字列のオフセットを定義するために、2 番目の定数セットまたは #defines が必要になります。

例えば

#DEFINE cmd_start 0
#DEFINE cmd_stop 1

だからこれは使える cmd_msgs[cmd_start]

だから私はあなたの2番目のオプションに行きます

char* cmd_start_str = "start";
于 2012-08-26T09:27:07.960 に答える
0

このアプリケーションでは、構造体の配列を使用します。

// Command handler signature. Choose as per your requirement.
    typedef int (*cmdHandlerType)(char * hostCmdString); 

    //Command Structure
    typedef struct
    {
        char *commandString; /**< points to the Command String*/
        cmdHandlerType cmdHandler; /**< points to the Command function*/
    } commandStruct;

    //All the commands and its functions
    static commandStruct  Commands[] = {
                            {"TEMP", TempCommand},
                            {"GAIN",   GainCommand}, 
                            {"SETPT", SetPtCommand},
                            {"...", ... },
                         };
int TempCommand( char *str)
{
     ...
}

このようにして、ホストからコマンドを取得するときに、コマンド文字列を照合して、対応するハンドラーを呼び出すことができます。

于 2012-08-26T09:40:24.620 に答える