vangeurmasker
Messages postés99Date d'inscriptionmercredi 12 mai 2004StatutMembreDernière intervention29 mars 2006
-
1 mars 2006 à 21:00
TheLudo2013
Messages postés77Date d'inscriptionmardi 12 novembre 2002StatutMembreDernière intervention18 octobre 2007
-
2 mars 2006 à 02:24
Voila la question est dans le titre. J'essaye de recoder un fonction
printf sans l'aide de la biblio standard du C. Je cherche donc a
remplacer les macros va_start ... par des version maison.
Si quelqu'un sait récupérer l'adresse des arguments d'une fonction.
TheLudo2013
Messages postés77Date d'inscriptionmardi 12 novembre 2002StatutMembreDernière intervention18 octobre 2007 2 mars 2006 à 02:24
Je m'étais posé la même question il y a quelques temps et j'avais découvert que va_list, va_start etc. sont déclarés au niveau du compilateur et pas de la bibliothèque standard du C. En clair tu peux les conserver même si tu recode une fonction printf ( ce que j'ai fait d'ailleur et qui fonctionne très bien )...
Alpacha
Messages postés95Date d'inscriptionmardi 9 mars 2004StatutMembreDernière intervention20 mars 2006 1 mars 2006 à 22:24
Je me trompe peut-être ... mais les arguments à l'appel d'une fonction doivent être dans la pile ou les registres ... donc récupération en assembleur je pense...
Cherche de ce côté là.
cs_bouba
Messages postés518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 20073 1 mars 2006 à 22:41
Salut, c'est faisable, mais bon, au niveau de l'affichage je ne sais pas trop. En tout cas, pour réaliser une fonction qui a une nombre variable d'arguments il faut faire un truc dans ce style:
#include <stdio.h>
#include <stdarg.h>
int printf(const char* format, ...) {
va_list ptr_arguments;
// parser le paramètre format de la fonction
// en fonction de ceci, lire les arguments, traiter char %s, %i, etc... un par un, avant
// mettre tous les %s, %i dans un tableau par[]
va_start(ptr_arguments, variable);
// ici 'variable' sera d'un type différent selon %s, %i, etc... par[i] == ???
while((variable = va_arg(ptr_arguments, type)) != 0) {
// type dépend de 'variable', int,char, etc...
switch(type_courant) {
case 0:
afficher_un_entier
break;
case 1:
afficher_un_char
break;
...
...
}
}
va_end(ptr_arguments);
return ....;
}
Voilà, en gros je pense que ça peut se faire comme ça. Sinon, tu peux peut-être regarder le code de la libc tu trouvera la vraie définition de la fonction printf (j'ai jamais regardé, ça doit vraiment être énorme !!!).
cs_bouba
Messages postés518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 20073 1 mars 2006 à 23:48
Oui, je pense que oui, les arguments sont à chopper dans le pile, j'ai fait un peut d'assembleur mais je ne me souvient plus trop. C'est net qu'il faut utiliser de l'assembleur. Dans mon msg HS, je conseillais d'aller regarder la définition de printf dans la libc, y'a sans doute aussi des chauses très intéressantes sur les fonctions va_start, va_arg et va_end, notamment la manière d'accéder aux arguments dans la pile.