1

浮動小数点環境と固定小数点環境の両方で実行する必要がある DSP コードを作成しようとしています (数値型はコンパイル時に決定されます)。マクロまたは typedef を使用して、特定の数値型にエイリアスを設定したいと思います。乗算、除算、およびその他の数学関数は、数値型に応じて実装が大幅に異なるため、特定のヘッダーを含めるかどうかを決定し、数値型に基づいて実装を変更するために、ある種のスイッチが必要になります。

例として短いコードスニペットを示します...

typedef samp_t float;
// or #define samp_t float (bad naming practice?)

// An alternative in fixed point
samp_t multiply_samp_t(samp_t a, samp_t b){
   return a*b;
}

/* typedef samp_t int;
#define RADIX 24
samp_t multiply_samp_t(samp_t a, samp_t b){
   return (samp_t) ((long) a)*((long) b) >> RADIX);
}
*/

void main(void){
  samp_t a,b,c;
   a = 15;
   b = 27;
   c = multiply_samp_t(a,b);
}

では、samp_t の型に基づいて、2 つの異なる乗算関数をどのように切り替えるのでしょうか? 推奨事項や提案は大歓迎です。ありがとう!-ブラント

4

1 に答える 1

0

コンパイル時にデータ型に対応する関数を選択する例を次に示します。

#define SYSTEM_FLOAT 0
#define SYSTEM_INT 1

// main selection
#define TYPE_SYSTEM FLOAT

#if TYPE_SYSTEM == SYSTEM_FLOAT
  #define SAMP_T float
  #define mult_samp_t   mult_samp_t_float
#elif TYPE_SYSTEM == SYSTEM_INT
  #define SAMP_T int
  #define mult_samp_t   mult_samp_t_int
#elif ...
#endif

void main(void){
  SAMP_T a,b,c;
   a = 15;
   b = 27;
   c = mult_samp_t(a,b);
}

コードのどこかで次を定義する必要があります。

float mult_samp_t_float(float a, float b)
{ 
  ...
  return a float;
}

float mult_samp_t_int(int a, int b)
{ 
  ...
  return an int;
}

つまり、選択した型システムによって、使用する関数セット全体が設定されます。ただし、ここで紹介した方法ではコードのデバッグが難しくなるため、ランタイムの選択と関数を使用できない場合にのみ、このスキームを使用することをお勧めします (過去に問題が発生したことはありませんが)。

(私はプロのOSのコードでもっと悪いことに遭遇しました:-))

于 2012-04-23T21:48:13.497 に答える