Je suis en train de recoder printf, mais un petit problème me bloque:
Si on execute ceci:
printf("%d\n", 21.65, 12.974, 1.9, 42);
on obtient ceci:
42
Mon problème est donc: Comment printf se rend compte que les arguments 3 premiers arguments ne sont pas des int ? Car pour moi, les varargs s'utilise en connaissant le type à l'avance (c'est pour cela que va_start demande un char*, et un va_list et que va_arg demande le type dans sa macro).
Si une âme charitable à une idée je suis preneur
EDIT:
Par contre, ci on test ceci:
printf("%d\n", 42.5);
on obtient un nombre qui semble aléatoire, comme si il y avait un dépassement de memoire ou une utilisation d'une zone memoire non initialisée:
La réponse que tu cherches est ici ! et ici, pour une liste plus exhaustive des types de variables que tu peux afficher avec printf !
char boissons[] = "cafés";
int nombreBoissons = 2;
float tauxSucre = 5.4;
// Printf affiche aussi le café
printf("Voici %d délicieux %s avec %f grammes de sucre.", nombreBoissons, boissons, tauxSucre);
Voici 2 délicieux cafés avec 5.400000 grammes de sucre.
Pour convertir un type en un autre, il faut caster la variable : (<type>)<variable>
printf("Voici %d délicieux %s avec %d grammes de sucre.", nombreBoissons, boissons, (int)tauxSucre);
Ici, j'ai rajouté (int) pour changer le float en int. tauxSucre reste de type float, et vaut toujours 5.400000, mais (int) a converti sa valeur en int pour permettre à printf de l'afficher ainsi :
Voici 2 délicieux cafés avec 5 grammes de sucre.
Bien entendu, il faut alors donner à printf l'instruction d'afficher un int, et non un float. Le %f a été remplacé par %d.
Edit : je pense avoir mal compris la question. Pour afficher indifféremment une variable de type int, long, float ou double, le mieux serait :
printf("%f", (double)variable);
Cela afficherait toute variable en tant que flottant. Pour faire cela avec plusieurs variables, répéter la commande ou faire une boucle for me semble une bonne idée.
Pour enlever la virgule aux valeurs entières, pourquoi pas faire comme ceci :
Mon problème est donc: Comment printf se rend compte que les arguments 3 premiers arguments ne sont pas des int ?
Ce n'est pas printf() lui même qui s'en rends compte, c'est le compilateur. Cette fonction est tellement utilisée que les développeurs des compilateurs ont intégré le parsing de la chaîne de formatage (l'argument const char *fmt de printf()) et le compare au type résolu des arguments lors de la compilation.
Par exemple, GCC a un attribut qui permet de faire ce type de vérification (voir ici en cherchant le mot-clé format ) .
A l’exécution, printf()ne voit que des adresses mémoires et valeurs qu'on lui demande d’interpréter d'une certaine façon, indépendamment du type effectif .
Mon problème est donc: Comment printf se rend compte que les arguments 3 premiers arguments ne sont pas des int ?
Bonjour,
La fonction ne s'en rend pas compte, et pire, ce code source a un comportement indéterminé du point de vue du langage; il pourrait aussi bien causer un crash. Cela dit, il n'y a pas de crash, et pour comprendre ce qu'il se passe il ne faut pas chercher dans le langage, mais en-dessous, dans l'ABI. En supposant l'ABI System V Application Binary Interface AMD64 Architecture Processor Supplement, on peut lire dans https://web.archive.org/web/20080611000810/http://www.x86-64.org/documentation/abi.pdf pages 17-20 que le premier int est passé dans le registre %rax, tandis que les double sont passés dans les registres %xmm0, %xmm1...
Merci a tous pour vos responses, j'espère qu'elles aideront personnes, je n'avait pas réfléchis aux gestions du compilo. Effectivement, mon ft_printf (oui je suis à 42 :D) semble bien géré cela à son insu.
va_args comment connaitre l'argument à l'avance ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent