Pouvons-nous transmettre des arguments de différents types de données à la même fonction variadique en même temps?arguments de type de données variables dans des fonctions variadiques
Répondre
so ross$ expand < variadic.c && cc -Wall -Wextra variadic.c
#include <stdio.h>
#include <stdarg.h>
void f(int, ...);
struct x { int a, b; } y = { 5, 6 };
int main(void) {
float q = 9.4;
f(0, 1.234, &q, "how now", 123, &y);
return 0;
}
void f(int nothing, ...) {
va_list ap;
va_start(ap, nothing);
double f = va_arg(ap, double);
float *f2 = va_arg(ap, float *);
char *s = va_arg(ap, char *);
int i = va_arg(ap, int);
struct x *sx = va_arg(ap, struct x *);
va_end(ap);
printf("%5.3f %3.1f %s %d %d/%d\n", f, *f2, s, i, sx->a, sx->b);
}
so ross$ ./a.out
1.234 9.4 how now 123 5/6
vous, regardez les usages communs de printf:
printf("Error %d: %s", errNum, errTxt);
Voici un exemple sans printf (ancienne version: http://codepad.org/vnjFj7Uh)
#include <stdarg.h>
#include <stdio.h>
/* return the maximum of n values. if n < 1 returns 0 */
/* lying to the compiler is not supported in this version, eg: **
** va_max(4, 8, 8, 8, 8, 8, 8, 8, 8) **
** or **
** va_max(4, 2, 2) **
/* is a bad way to call the function (and invokes Undefined Behaviour) */
int va_max(int n, ...) {
int res;
va_list arg;
if (n < 1) return 0;
va_start(arg, n);
n--;
res = va_arg(arg, int);
while (n--) {
int cur = va_arg(arg, int);
if (cur > res) res = cur;
}
return res;
}
int main(void) {
int test6 = va_max(6, 1, 2, 3, 4, 5, 6);
int test3 = va_max(3, 56, 34, 12);
if (test6 == 6) puts("6");
if (test3 == 56) puts("56");
return 0;
}
Juste un détail technique ... Je vois quelques appels 'printf' dedans ... ;-) –
La fonction principale était une après pensée ... mais plus printfs maintenant (sauf sur le codepad) – pmg
J'ai fait une fonction pour décompresser des données binaires en utilisant une fonction varadic, il faut différents types basés sur ce que vous voulez "codé/décodé".
Vous souhaitez l'utiliser comme:
uint32_t a;
uint16_t b;
uint16_t c;
uint8_t *buf = ....;
depickle(buf,"sis",&a,&b,&c);
où l « » attend un uint16_t * et décode 2 octets de buf
dans a
aussi peu endian, « i » dit décoder 4 octets comme peu endian dans 'b'
Ou à par exemple décoder 4 octets comme grand-boutiste dans un uint32_t:
uint32_t a;
uint8_t buf[] = {0x12,0x34,0x56,0x78};
depickle(buf,"I",&a);
Il y a encore une première version autour here.
- 1. C, avec des fonctions Traiter arguments variables
- 2. Smalltalk Fonctions variadiques
- 3. Transférer des arguments variables
- 4. Comment utiliser va_args pour passer des arguments (paramètres variadiques, ellipses)
- 5. Désambiguïsation des appels de fonctions sans argument dans les hiérarchies de classes variadiques
- 6. Utilise des fonctions variadiques dans C89 sans passer le nombre d'arguments ou un argument final?
- 7. étendue des variables dans les fonctions de rappel JavaScript
- 8. excel vba: Types spéciaux - Fonctions comme arguments de fonctions
- 9. arguments variables dans une macro
- 10. l'ordre des Manipuler arguments de type constructeurs
- 11. initialize variables impliquant vecteur type de données
- 12. stockage pour les listes de traitement des arguments variables
- 13. comment aligner des arguments à des fonctions dans emacs?
- 14. Comment lier des arguments à des valeurs données dans des fonctions Python?
- 15. concaténer récursive a des fonctions javascript arguments
- 16. Invoquer des fonctions avec des arguments `out`, en passant des arguments par référence dans JScript
- 17. Javascript Fonctions et arguments optionnels
- 18. Quelles sont les fonctions variadiques selon C et C++?
- 19. Utilisation des fonctions comme arguments dans les fonctions d'agrégation de mise en veille prolongée
- 20. Portée des variables à l'intérieur des fonctions anonymes en C#
- 21. Mises en garde dans les méthodes avec des arguments variables
- 22. Modèles variadiques
- 23. Extraction des arguments de fonctions à l'aide RegExp (PREG)
- 24. PHP Classe arguments dans les fonctions
- 25. Passer des variables à des fonctions de rappel
- 26. Type indiquant des fonctions dans Clojure
- 27. C++ Modèle Constructeur de la classe avec des arguments variables
- 28. PHP inclure des fonctions de classe avec des variables
- 29. longueur variable des arguments lus à partir de variables Matlab
- 30. Existe-t-il un moyen de spécifier des arguments de type référence ou valeur dans les fonctions javascript?
Pouvez-vous donner un exemple, sauf printf – Shweta
@Shweta: scanf serait l'autre évidente. Ceux-ci (avec des variantes comme sprintf, fscanf, etc.) sont presque les seules fonctions variadiques en usage très répandu. –