Bonjour,
J'utilse une fonction à taille variable d'arguments et je désire afficher sous forme de string l'ensemble de mes variables présentes. Je précise aussi que les variables récupérées sont censées être de type byte, word ou longword.
J'ai un gros soucis avec la fonction va_arg(argList,char*) qui retourne soit rien soit (null).
Dans le code que je vous joins, j'ai tenté deux méthodes:
1) Utiliser la fonction vsprintf
2) Lire chaque variable sous forme d'entier, convertir en format string, puis concaténer dansune unique chaine l'ensemble de ses variables.
L'affichage de la variable avec la fonction va_arg(argList,int) est complètement différent de va_arg(argList,char*) , pourquoi?
Code d'appel de la fonction contenant va_list:
Code de la fonction ParametersChain(theFormat,argList);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 va_list argList; CString parameters = NULL; if ((gRDSFlag == 1) && (theEvent <= RDS_FormerMaxEvNum)) { /*Routine to save info about RDS event in the circular buffer for Post Mortem file*/ va_start(argList,theFormat); parameters = ParametersChain(theFormat,argList); va_end(argList); SaveRdsEvPostMortem(theEvent, theClass, theSubcode, theFormat, parameters); }
Et voici le résultas des printf des 3 derniers appels à cette fonction:
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 char* ParametersChain(CString theFormat, va_list argList) { char* parameters = NULL; char* nextParameter = NULL; /*To get parameters from the format variable*/ if(theFormat == NULL ){ parameters = "None"; } else{ /*méthode1: utiliser vsprintf et se passer de la boucle while*/ vsprintf(parameters,theFormat,argList); printf("vsprintf chaine: %s\n", parameters); /* Get and add each param except the last one to the event */ /*méthode2: récupérer sous forme de chaine chaque variable et concaténer*/ while (*theFormat != '\0') { printf("chaine: %s\n", va_arg(argList, char*)); /*Ne marche pas*/ sprintf(nextParameter, "%x", va_arg(argList, int)); sprintf(parameters,"%s%s%s%s",parameters,"0x",nextParameter," "); printf("parameters = %s, %d \n",parameters,va_arg (argList, int)); /* advance to the next format character */ theFormat++; } va_end(argList); printf("parameters chain = %s\n\n", parameters); } /* has param */ return "nico"/*parameters*/; }
Si vous avez des explications à ces résultats obtenus et des moyens de les résoudre?vsprintf chaine: (null)
parameters chain = (null)
vsprintf chaine: (null)
chaine:
parameters = (null), 13
parameters chain = (null)
vsprintf chaine: (null)
chaine: (null)
parameters = (null), 100
chaine: tC¦|h¦Hò©8a
parameters = (null), 2
chaine:
parameters = (null), 197306752
parameters chain = (null)
Merci d'avance.
Partager