2017-02-16 7 views
1

このプロジェクトをコーディングする中で、私はuint8_t、uint16_t、uint32_tの両方の変数を扱えるようにする必要があるという状況に陥っています。C言語の動的関数の引数を扱う

重大なコードや重複したコードを作成せずにこのダイナミックを維持するための適切なソリューションを見つけることを試みますが、最も重要なのは、保存ソリューションです。この関数はもう少し動的にするための試みである

typedef struct 
{ 
    DataType type; 
    union 
    { 
    uint8_t uint8; 
    uint16_t uint16; 
    uint32_t uint32; 
    } unsignedInt; 
} anySizeUnsignedType; 

、今しかし、私はこれらのタイプの2を持っている:私は、関数の引数として労働組合を持つ構造体を使用して、現在のコードで

私の関数では、3番目の変数に応じてそれらを比較する必要があります。

だから、これは私が何をしようとしている基本的には次のとおりです。

anySizeUnsignedType Var1 = arg1; 
anySizeUnsignedType Var2 = arg2; 
uint8_t comparison = arg3; 

switch (comparison) 
{ 

    case ABOVE: 

     if (Var1 > Var2) 
     { 
     retValue = TRUE; 
     }  
     break; 

    case EQUAL: 

     if (Var1 > (Var2 - AnotherVar) 
      && (Var1 < (Var2 + AnotherVar))) 

     { 
     retValue = TRUE; 
     }  
     break; 

    case BELOW: 
     if (Var1 < Var2) 
     { 
     retValue = TRUE; 
     }  
     break; 

    default: 
     /* Should be impossible */ 
     break; 

    } 

問題:私はもちろん、その構造体のために「ヴァール」を比較することはできません、私はuint8_tを比較する必要があり、uint16_tまたはuint32_tを使用する代わりに、これを行う方法があります符号なしの3つのタイプすべてに対して同じコードを使用せずにを保存しますか?

これを行うには一般的により良い解決策がありますか?それとも、これをやりたいと思わない理由でしょうか?

私はこれをしようとしている理由:異なる出力と異なるセンサからのセンサデータを処理し、独自の公式の解像度を保ち、

+1

ユニオンを削除して、常にuint32_tに格納してください。 –

+0

私達は昨日同様の質問をしました、[here](http://stackoverflow.com/a/42245994/584518)。おそらく、非常に同じ種類の多形体設計を使うことで利益を得ることができます。 – Lundin

+0

"above"と "below"?私は高校の数学の先生が "今、梯子か何かの変数の一つですか?"と聞くことができます。 – kkrambo

答えて

5

を私はとして

int compare(uint32_t arg1, uint32_t arg2, uint8_t comparison)

を使用するように傾斜させることだろう(シングル)関数であり、arg1arg2の狭いバージョンの場合は型の拡大に依存します。

関連する問題