Bonjour à tous,
Je reviens sur le site pour solliciter les éclairages de développeurs en C. J'ai cherché en vain la possibilité du propager une liste variable d'arguments d'une fonction vers une autre.
Soit la suite des deux instructions suivantes fréquemment utilisées comme telles dans une mise en page :
Il serait souhaitable, pour simplifier le travail du programmeur, de proposer directement un appel à une fonction plus élaborée comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sprintf (zone , "x=%d - y=%d - z=%d" , x , y , z) ; iret = fonction_A (a , b , c , attribut , zone) ;
Dans le passé, j'ai eu, une ou deux fois, l'occasion d'utiliser les listes variables d'arguments. Je pensais que, dans le cas présent, le problème était beaucoup plus simple puisque l'analyse du format était refilée à la fonction standard "sprintf". J'ai donc écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part iret = fonction_B( a , b , c , attribut , "x=%d - y=%d - z=%d", x , y , z) ;
La compilation et l'édition de liens se passent très bien mais l'exécution, sans erreur, n'est pas bonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int fonction_B( a , b , c , attribut , format , va_alist) int a, b, c ; char attribut[] ; char format[] ; { char zone[256] ; va_list ap ; va_start(ap , format) ; // liste variable après 'format' sprintf (zone, format, ap ) ; va_end(ap) ; return (fonction_A( a , b , c , attribut , zone) ) ; }
Très sincèrement, je ne vois pas où je fais des erreurs. J'ai probablement mal interprété la documentation que j'ai pu glaner ça et là sur la Toile.
Je suis sous MinGW/Msys Windows. À son installation, MinGW n'avait pas incorporé le fichier d'entête "stdarg.h". J'en ai téléchargé plusieurs. Le seul qui ne provoque pas d'erreur à la compilation est celui ci-dessous :
La forme "int fonction_B( a , b , c , attribut , format , ...)" provoque une erreur à la compilation !...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef __STDARG_H #define __STDARG_H typedef void *va_list; #define __size(x) ((sizeof(x)+sizeof(int)-1) & ~(sizeof(int)-1)) #define va_start(ap, parmN) ((void)((ap) = (va_list)((char *)(&parmN)+__size(parmN)))) #define va_arg(ap, type) (*(type *)(((*(char **)&(ap))+=__size(type))-(__size(type)))) #define va_end(ap) ((void)0) #if !__STDC__ #define _va_ptr (...) #endif #endif
Avez-vous une idée ?
Merci d'avance.
Cordialement.
Lou Papet
Partager