2017-09-11 3 views
-1

Je suis en train de passer une liste d'arguments variables d'éléments vides * à une fonction en C.langage C: Comment passer une liste d'arguments variables de vide * une fonction

  1. Comment puis-je faire ?

  2. Comment calculer le nombre d'éléments dans la liste? Comment faire une boucle dans la liste var-args et passer chaque élément vide * à une autre fonction qui prend un élément void * comme paramètre?

C'est ce que j'ai fait, mais cela ne fonctionne pas.

void AddValues(List* data, void* args, ...) { 

int len = sizeof (args)/sizeof (*args); 


for(int i=0;i<len;i++){ processItem(args[0]); } 

} 

void processItem(void* item){ 

} 
+2

http: // fr .cppreference.com/w/c/variadic – Rafael

+1

Vous ne pouvez pas calculer la longueur de cette façon. 'sizeof (args)/sizeof (* args)' = 'sizeof (void *)/sizeof (void)' mais void n'a pas de taille. Les fonctions qui prennent des listes varargs doivent pouvoir déterminer la taille d'une autre source: - un autre paramètre (printf utilise le nombre de% dans la chaîne de format) ou une valeur spéciale (comme tous les pointeurs void * pointent vers les choses et le dernier l'un est NULL) Donc soit le premier paramètre doit être la taille, soit votre dernier vide * doit avoir une valeur sentinelle spéciale. –

+1

@gbenroscience Votre paramètre 'void *' n'a absolument rien à voir avec le '...' pour var-args. Vous ne pouvez pas déférer un 'void *', et si vous le pouviez, cela ne vous dirait pas combien de choses ont été pointées ou quoi que ce soit, car en ce qui concerne le compilateur, c'est juste un pointeur vers 'void'. –

Répondre

2

Comment calculer le nombre d'éléments dans la liste?

Vous ne pouvez pas. Il doit être fourni ou dérivé.

Comment puis-je boucle à travers le var-args liste et passer chaque vide article à une autre fonction qui prend un élément void * comme paramètre? *

Comme indiqué dans Variadic Functions,

#include <stdarg.h> 

void AddValues(int count, ...) { 
    va_list args; 
    va_start(args, count); 

    for(int i=count; i--;) 
     processItem(va_arg(args, void*)); 

    va_end(args); 
} 

Exemple d'utilisation:

void* p1 = ...; 
void* p2 = ...; 
void* p3 = ...; 
void* p4 = ...; 

AddValues(4, p1, p2, p3, p4); 

Cela dépend de ce que vous faites, mais vous devriez probablement utiliser un tableau plutôt que des paramètres variadiques.

void AddValues(int count, const void** args) { 
    for(int i=count; i--;) 
     processItem(*(args++)); 
} 

Exemple d'utilisation:

#define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0])) 

void* ptrs[4]; 
ptrs[0] = ...; 
ptrs[1] = ...; 
ptrs[2] = ...; 
ptrs[3] = ...; 

AddValues(C_ARRAY_LEN(ptrs), ptrs); 

Ou (si les pointeurs ne peuvent pas être NULL):

void AddValues(const void** args) { 
    while (*args != NULL) 
     processItem(*(args++)); 
} 

Exemple d'utilisation:

void* ptrs[5]; 
ptrs[0] = ...; 
ptrs[1] = ...; 
ptrs[2] = ...; 
ptrs[3] = ...; 
ptrs[4] = NULL; 

AddValues(ptrs); 
+0

alors va_arg et va_end sont des fonctions intégrées? – gbenroscience

+1

@gbenroscience Fonctions de bibliothèque standard.À peu près aussi intégré que possible. Il peut y avoir quelques changements de révision standard à la révision standard, mais C tend à être conservateur avec ses changements pour éviter de sauter jusqu'à 50 ans de code hérité. – user4581301

+0

Oui, je viens de le trouver. Merci – gbenroscience