Depuis la norme ANSI, des mécanismes standards ont été intégré au langage C permettant de traiter des listes d'arguments variables et ceci de façon portable. Ce chapitre présente les différents éléments qui entrent en jeu.
Traitement d'une liste d'arguments variable
Exercices
La norme ANSI définit des mécanismes permettant de traiter de façon portable des listes d'arguments variables telles qu'on en trouve par exemple dans les fonctions printf et scanf. Ces mécanismes n'étaient pas définis en K&R C. Ce chapitre est donc spécifique à la norme ANSI.
Pour pouvoir traiter des listes d'arguments variables, il faut inclure le fichier stdarg.h :
#include <stdarg.h>
On dispose alors d'un type, va_list, et de trois opérations sur des objets de ce type, va_arg, va_end et va_start.
Illustrons le fonctionnement de ces opérations à l'aide d'un exemple. Soit une fonction qui doit calculer la somme d'une liste variable de nombres entiers, le nombre exact de nombres à additionner étant fourni en paramètre. L'entête de la fonction s'écrit :
int somme (int n, ...)
Les trois points "..." indiquent que la fonction admet une liste d'arguments variable.
Dans cette fonction il faut alors déclarer une variable de type va_list, en fait une variable qui va pointer sur les différents arguments de la liste :
int somme (int n, ...) {
va_list jePointeSurUnArgument;
...
}
La variable de type va_list doit être initialisée à l'aide de l'opération va_start qui a besoin pour cela du paramètre qui précède la liste d'arguments variable :
int somme (int n, ...) {
va_list jePointeSurUnArgument;
va_start (jePointeSurUnArgument, n);
...
}
On peut ensuite accéder successivement aux différents arguments de la liste d'arguments variables à l'aide de l'opération va_arg qui retourne à chaque fois l'argument pointé par jePointeSurUnArgument et fait pointer celle-ci sur l'argument suivant. Elle a besoin pour cela du pointeur d'arguments et du type de l'argument qu'elle doit retourner :
int somme (int n, ...) {
va_list jePointeSurUnArgument;
int jeCompteLesArguments, resultat;
va_start (jePointeSurUnArgument, n);
for (resultat = jeCompteLesArguments = 0;
jeCompteLesArguments < n;
jeCompteLesArguments++)
resultat += va_arg (jePointeSurUnArgument, int);
...
}
Nous avons déclaré deux variables locales jeCompteLesArguments et resultat. La première nous sert à compter les arguments déjà traités de la liste d'arguments variables, la deuxième contient le résultat final, c'est-à-dire la somme des arguments.
Enfin, quand elle a fini son traitement, la fonction doit utiliser l'opération va_end pour clore l'accès à la liste d'arguments variable :
int somme (int n, ...) {
va_list jePointeSurUnArgument;
int jeCompteLesArguments, resultat;
va_start (jePointeSurUnArgument, n);
for (resultat = jeCompteLesArguments = 0;
jeCompteLesArguments < n;
jeCompteLesArguments++)
resultat += va_arg (jePointeSurUnArgument, int);
va_end (jePointeSurUnArgument);
return resultat;
}
Concevoir une fonction "moyenne" qui calcule la moyenne d'un nombre n donné mais variable de réels.
La solution de l'exercice peut être consultée.
Concevoir une fonction "concaténation" qui concatène un nombre n donné mais variable de chaînes de caractères et les stocke dans une chaîne destination.
La solution de l'exercice peut être consultée.
|
|
© 2003, Pierre Mousel Veuillez faire parvenir toute remarque ou commentaire à Pierre Mousel |