Réécrire va_start va_arg et va_list

Résolu
vangeurmasker Messages postés 99 Date d'inscription mercredi 12 mai 2004 Statut Membre Dernière intervention 29 mars 2006 - 1 mars 2006 à 21:00
TheLudo2013 Messages postés 77 Date d'inscription mardi 12 novembre 2002 Statut Membre Dernière intervention 18 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.
A voir également:

7 réponses

Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 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à.
0
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
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 !!!).

Bonne chance.
Bouba
0
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
1 mars 2006 à 22:42
Pfff, je viens de relire ton msg, mon post est complètement HS, je vais me coucher la !!!!
0
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
1 mars 2006 à 22:44
Lol^^
Et donc, 2eme version, tu penses que j'ai indiqué une bonne piste?
Enfin j'vois que comme ça qu'on peut le faire ...
0

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

Posez votre question
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
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.
0
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
1 mars 2006 à 23:50
Ah c'est bien la pile :)
Bon courage à l'auteur du post, maintenant qu'il a la piste à suivre
0
TheLudo2013 Messages postés 77 Date d'inscription mardi 12 novembre 2002 Statut Membre Dernière intervention 18 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 )...

@++
TheLudo2013
-1
Rejoignez-nous