Fonction style printf en c / c++

Résolu/Fermé
Nabla - 20 mai 2008 à 11:01
 Nabla - 20 mai 2008 à 13:17
Bonjour,

par curiosité, j aimerai savoir comment créer une fonction avec un nombre de parametres variables et de type non connu.

l'exemple type de ce genre de fonctions est bien entendu la fameuse fonction printf(), ainsi que toutes la petite famille (scanf, scanf, sprintf, ...).

quelqu'un connaitrait il la manière de declarer de telles fonctions? et ensuite, comment recuperer le type de variables ?

merci d avance :)
A voir également:

6 réponses

bon, en fait, ca se fait grace au va_list. cf le code pompé sur ce site:
https://codes-sources.commentcamarche.net/

void MaFonction(int x,...)
{
va_list vargs; /* Liste d'arguments optionnels */

/* La liste d'arguments commence après le dernier argument formel */
va_start(vargs,x);

/* Récupération d'un argument de type int */
width=va_arg(vargs,int);

/* Récupération d'un argument de type char */
width=va_arg(vargs,char);

/* Fin de lecture de la liste optionnelle */
va_end(vargs);

}

aussi ce site:
http://homepage.mac.com/pierremousel/LangC/LangCArgumentsVar.html

voila... dans le printf, il n y a plus qu a parser le premier argument pour savoir quels type de variable on recupère...
merci daron pour ton aide.
1
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 mai 2008 à 11:04
peut-etre en prenant deux liste en parametre :

-une liste sur les type que tu as défini
-une liste de pointeur sur les parametres

comme ça tu n'as pas de taille fixe de parametre, enfin essaie mais je pense que cela peut marcher, genre fais un type enumérer pour tes types de parametres ...

bon courage

tchû
0
Ca semble une bonne idée de remplacement, mais cela ne correspond pas a ce qui est utilisé pour un printf, auquel on peut passer indiferement des char*, int, char, ....

la definition de la fonction dans stdio.h est:

_CRTIMP int __cdecl printf(const char *, ...);

les ... semblent representer l infinité de parametres possible, et tres probablement on doit recuperer des tableaux quelque part, uin genre de argc, argv[], puis une liste de types aussi comme tu le suggérais ...
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 mai 2008 à 11:49
peut etre mais il te faudra par la suite parser ton const char * pour savoir ce qu'il se trouve à l'intérieur

good luck
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oui, bien sur, printf parse le const char*, mais mon but n'est pas de réécrire la fonction priintf, c est juste qu'en ce moment je tape de code toute la journée, et je me demandais quel pouvait bien être le code source derriere cette fonction.

Ceci dit, je pense que tu me met sur la voie concernant le type des parametres: peut être qu il n est pas indiqué, mais qu'il est déduit grace a la chaine de format de données ...

ce qui remplacerait le probleme par celui ci:
existe t il un moyen d acceder aux parametres SANS connaitre leur nom, juste en connaissant leur numero d ordre de passage sur la pile... autrement dit, savez vous acceder a la pile d appels de fonctions ... trouver un petit void parameters** quelque part ....

Je rapelle que c est juste une curiosité sur la programmation en C, et je n en ai pas vriament l utilité.. juste pour étanche ma soif de connaissances...
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
20 mai 2008 à 12:08
là je ne peux plus t'aider, désolé

tchû
0
Je pense honnetement que peux de personne sont interessées par le fonctionnement de ce genre de fonctions.... je trouve ca dommage vu que quand on voit la puissance des fonctions telles que sscanf ...
je vais devoir telecharger le code source d un compilateur en esperant y comprendre qqch...

j ai bien trouvé quelqu un qui utilisait sur http://www.koders.com/cpp/fid8B1917003A37987BF74F4FD460B7B816B156FFE4.aspx
mais je susi pas sur de pouvoir en faire qqch ...
0