C - Arguments variables

Parfois, vous pouvez rencontrer une situation, lorsque vous voulez avoir une fonction, qui peut prendre un nombre variable d'arguments, c'est-à-dire des paramètres, au lieu d'un nombre prédéfini de paramètres. Le langage de programmation C fournit une solution à cette situation et vous êtes autorisé à définir une fonction qui peut accepter un nombre variable de paramètres en fonction de vos besoins. L'exemple suivant montre la définition d'une telle fonction.

int func(int, ... ) {
   .
   .
   .
}

int main() {
   func(1, 2, 3);
   func(1, 2, 3, 4);
}

Il est à noter que la fonction func() a son dernier argument sous forme d'ellipses, c'est-à-dire trois points (...) et celui juste avant les ellipses est toujours un intqui représentera le nombre total d'arguments de variable passés. Pour utiliser ces fonctionnalités, vous devez utiliserstdarg.h fichier d'en-tête qui fournit les fonctions et les macros pour implémenter la fonctionnalité des arguments variables et suivre les étapes données -

  • Définissez une fonction avec son dernier paramètre sous forme d'ellipses et celui juste avant les ellipses est toujours un int qui représentera le nombre d'arguments.

  • Créer un va_listtype variable dans la définition de la fonction. Ce type est défini dans le fichier d'en-tête stdarg.h.

  • Utilisation int paramètre et va_start macro pour initialiser le va_listvariable à une liste d'arguments. La macro va_start est définie dans le fichier d'en-tête stdarg.h.

  • Utilisation va_arg macro et va_list variable pour accéder à chaque élément de la liste d'arguments.

  • Utilisez une macro va_end pour nettoyer la mémoire affectée à va_list variable.

Maintenant, suivons les étapes ci-dessus et notons une fonction simple qui peut prendre le nombre variable de paramètres et renvoyer leur moyenne -

#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));
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant. Il est à noter que la fonctionaverage()a été appelé deux fois et à chaque fois le premier argument représente le nombre total d'arguments de variable passés. Seules les ellipses seront utilisées pour passer un nombre variable d'arguments.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000