Saturday, September 1, 2018

C - 可変引数

場合によっては、あらかじめ定義された数のパラメータの代わりに、可変数の引数、つまりパラメータを取ることができる関数を持つことが必要な状況に遭遇することがあります。 Cプログラミング言語はこのような状況の解決策を提供し、要件に応じてさまざまなパラメータを受け入れることができる関数を定義することができます。 次の例は、このような関数の定義を示しています。
int func(int, ... ) {
   .
   .
   .
}

int main() {
   func(1, 2, 3);
   func(1, 2, 3, 4);
}
ファンクションfunc()は最後の引数を省略記号、すなわち3つのドット(...)とし、楕円の直前のものは常に可変引数の総数を表すintであることに留意すべきである。このような機能を使用するには、stdarg.hヘッダファイルを利用する必要があります。stdarg.hヘッダファイルは、可変引数の機能を実装するための関数とマクロを提供し、

  1. 最後のパラメータが省略記号である関数を定義し、省略記号の直前の引数は常に引数の数を表すintである。
  2. 関数定義にva_list型変数を作成します。この型はstdarg.hヘッダーファイルで定義されています。
  3. intパラメータとva_startマクロを使用して、va_list変数を引数リストに初期化します。マクロva_startは、stdarg.hヘッダーファイルで定義されています。
  4. 引数リストの各項目にアクセスするには、va_argマクロとva_list変数を使用します。
  5. va_list変数に割り当てられたメモリーをクリーンアップするには、マクロva_endを使用します。

上記の手順に従って、可変数のパラメータをとり、それらの平均を返すことのできる単純な関数を書き留めてみましょう

#include <stdio.h>
#include <stdarg.h>

double average(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }
 
   /* clean memory reserved for valist */
   va_end(valist);

   return sum/num;
}

int main() {
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

上記のコードをコンパイルして実行すると、次の結果が生成されます。 function average()は2回呼び出され、最初の引数が渡される可変引数の総数を表すたびに呼び出されることに注意してください。 可変数の引数を渡すには、省略記号のみが使用されます。
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000



















No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...