3

マイクロコントローラーへの RS232 インターフェースがあり、定義済みの一連のコマンドがあります。数百のコマンドがあります。たとえば、PRESSURE 50圧力を 50 に設定できます。LIMIT 60制限を 60 に設定できます。

現在、これは一連のネストされた switch ステートメントを使用して処理されますが、これは洗練されていないソリューションのようです。

これらのコマンドを処理するための推奨/最も効率的/最も読みやすい方法は何ですか? LUT は最も整頓されていますが、存在しない文字の組み合わせの空のエントリが多数あることは確かです (理想的ではありません..)。

アイデアをありがとう..

4

2 に答える 2

3
  1. 実行時の提案:

    struct { string, function pointer ) のソートされた配列を使用

    あなたのプラットフォームで利用できることを願っqsort()ています ( )bsearch()stdlib.h

  2. 設計時の提案:

    コメントが示唆するように、設計時に配列初期化のエントリをソートすることをお勧めします。コード生成 (豪華) からマクロ処理 (貧弱) まで、多くの方法が存在します。

    宣言の提案、1 つから複数:

    typedef unsigned char byte;
    
    typedef char commandId_t[40];
    
    typedef void (*commandHandler_t)( const byte * payload );
    
    typedef struct command_s {
       const commandId_t      commandId;
       const commandHandler_t handler;
    } command_t;
    
    static const command_t commands[] = {
    #include "sortedCommandInitializers"
    };
    

    このファイルは、Makefile 内のコマンドでソートできるsortedCommandInitializersリストです。{"command-name", function-name},sort CommandInitializers.c > sortedCommandInitializers

    それmakeは他のような依存関係です:

    sortedCommandInitializers: CommandInitializers.c
        sort CommandInitializers.c > sortedCommandInitializers
    
    myProgram.o: myProgram.c myProgram.h sortedCommandInitializers
    
于 2013-05-15T18:47:39.610 に答える