Comment puis-je passer beaucoup d’arguments à une fonction C? En supposant que j’ai cette fonction:
void f(int n, char* a, char* b, ...)
Je veux un nombre indéfini d’arguments char *. Comment puis-je le faire?
Ce dont vous avez besoin est appelé nombre variable de fonctions d’argument, vous pouvez y lire: 9.9. Un nombre variable d’arguments est un bon tutoriel.
Une brève théorie en quatre points vous aidera à comprendre mon code:
doit être inclus, il introduit un nouveau type, appelé va_list, et trois fonctions agissant sur des objects de ce type, appelées va_start, va_arg, and va_end
. va_start:
est une macro pour définir arg_ptr
au début de la liste ap
des arguments facultatifs. va_arg:
utilise ce pointeur de stack enregistré et extrait le nombre d’octets correct pour le type fourni va_end:
est une macro pour réinitialiser ap
, une fois que tous les arguments ont été récupérés, va_end
réinitialise le pointeur sur NULL. Cette théorie ne suffit pas, mais ci-dessous, un exemple (comme vous le souhaitez) vous aidera à comprendre le stream de travail / et les étapes de base: ( lisez le commentaire pour chacune des 4 étapes )
//Step1: Need necessary header file #include void f(int first, char* a, char* b, ...){ va_list ap; // vlist variable int n; // number char aa, int i; float f; //print fix numbers of arguments printf("\n %d, %s, %s\n", first, a, b); //Step2: To initialize `ap` using right-most argument that is `b` va_start(ap, b); //Step3: Now access vlist `ap` elements using va_arg() n = va_arg(ap, int); //first value in my list gives number of ele in list while(n--){ aa = (char)va_arg(ap, int); // notice type, and typecast i = va_arg(ap, int); f = (float)va_arg(ap, double); printf("\n %c %d %f \n", aa,i, f); } //Step4: Now work done, we should reset pointer to NULL va_end(ap); } int main(){ char* a = "Aoues"; char* b = "Guesmi"; f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1); // ^ this is `n` like count in variable list return 1; }
Qui fait ça?
~$ ./a.out 2, Aoues, Guesmi a 3 6.700000 b 5 5.500000 A 0 0.100000
Une brève explication de mon code sera utile pour les futurs utilisateurs:
char* b
dans notre fonction f()
) utilise uniquement pour initialiser la liste viable ap
. f()
ci-dessus poing lit n
valeur égale à 3
( lire le commentaire dans le menu principal ). Dans f()
, while(n--)
exécuté trois fois et chaque fois en boucle, en utilisant la macro va_arg()
nous va_arg()
trois valeurs. ints
puis un double
, Où, car j’envoie char, int, float
( remarque dans la section principale où j’appelle f () ). c’est parce que le type automatique est promu en cas de liste d’arguments variables (lire en détail ci-dessus lisk) Voici un autre lien utile de MSDN: va_arg, va_end, va_start .
( laissez-moi savoir si vous avez besoin de plus d’aide à ce sujet )
Utilisez varargs (recherchez vous-même, le contenu utilisé par l’appelé pour lire les stdarg.h
trouve dans stdarg.h
).
Notez qu’il n’y a aucun moyen pour l’appelé de déterminer automatiquement le nombre d’arguments réellement transmis. Ainsi, par exemple, il peut s’agir de n
, et il vous suffit de faire confiance à l’appelant pour que n
correct.