私は、コネクションレス(UDP)ソケットを使用して特定の患者モニターと通信するためのプログラムを作成しています。私は、患者モニターから受信したデータを解析するために使用すべき最も高速で効率的なアルゴリズムの提案が必要です。Cでのソケットプログラミングとレスポンスのシリアル化解除
患者モニタは、構造体の定義は以下の通りです、のAttributeList構造としてデータを送信します -
typedef struct {
uint16 count;
uint16 length;
AVAType * values;
} AttributeList;
typdef struct {
uint16 id;
uint16 length;
void * data;
} AVAType
そうのAttributeListが多くAVAType構造を含む、すべてのAVAType構造がvoidポインタとしてidとデータが含まれています(データがありますAVATypeの実際のデータのプレースホルダー)。実際、AVATypeと各IDに対して約150のIDが定義されているため、解析目的でデータを対応するデータ構造に配置する必要があります。
AVAType構造におけるIDが1であれば、そのデータは、アルゴリズムAを使用して解析されなければならないが、IDが2の場合、データはアルゴリズムBを使用して解析されなければならないなど...
私の現在のアプローチは、150を使用していますif-elseステートメントを実行し、AVATypeの特定のデータ構造体をロードして、結果を解析します。また、患者モニターはネットワーク経由でデータを送信し、IDごとにAVATypeを展開する必要があります。
このような状況に対処するには、適切な方法をお勧めします。それはちょうど大学のことです、私は安全性についてはあまり兄弟ではない、私は安全性が徐々に向上することができると思うが、今はスピードの私の懸念。
はい、それはactAully AVAType値[];です。これがなぜAVAType *と違うのか、より具体的に言えますか?私の構造を他の方法で定義するとどんなに役立つことができますか?
ハッシュマップを作成できます。ここで、keyはIDで、値は関数ポインタです。この方法では、if-else構造は必要ありませんが、ハッシュテーブルからアルゴリズムの関数を取得できます。編集:gbulmer言ったように、関数ポインタの配列がより合理的です。 – Timo
患者モニタを扱う際には、スピードよりも信頼性と安全性に重点を置くべきですか? –
メモリが限られている組み込みシステムで作業している場合を除き、配列を使用することをお勧めします。デバッグするのは簡単で、非常に予測可能です。 idはわずか16bitsしかありません。これはかなりの量の店舗です。実行時には非常に予測可能ですが、 'fun_ptr [id](...)'です。それは簡単なので、自動的にそれらをすべてテストする機能を追加し、そのデータと呼び出しが一致していることを確認してください。 – gbulmer