Réécrire va_start va_arg et va_list [Résolu]

vangeurmasker 99 Messages postés mercredi 12 mai 2004Date d'inscription 29 mars 2006 Dernière intervention - 1 mars 2006 à 21:00 - Dernière réponse : TheLudo2013 77 Messages postés mardi 12 novembre 2002Date d'inscription 18 octobre 2007 Dernière intervention
- 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.
Afficher la suite 

7 réponses

Répondre au sujet
TheLudo2013 77 Messages postés mardi 12 novembre 2002Date d'inscription 18 octobre 2007 Dernière intervention - 2 mars 2006 à 02:24
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TheLudo2013
Alpacha 95 Messages postés mardi 9 mars 2004Date d'inscription 20 mars 2006 Dernière intervention - 1 mars 2006 à 22:24
0
Utile
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à.
Commenter la réponse de Alpacha
cs_bouba 518 Messages postés dimanche 2 décembre 2001Date d'inscription 10 novembre 2007 Dernière intervention - 1 mars 2006 à 22:41
0
Utile
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
Commenter la réponse de cs_bouba
cs_bouba 518 Messages postés dimanche 2 décembre 2001Date d'inscription 10 novembre 2007 Dernière intervention - 1 mars 2006 à 22:42
0
Utile
Pfff, je viens de relire ton msg, mon post est complètement HS, je vais me coucher la !!!!
Commenter la réponse de cs_bouba
Alpacha 95 Messages postés mardi 9 mars 2004Date d'inscription 20 mars 2006 Dernière intervention - 1 mars 2006 à 22:44
0
Utile
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 ...
Commenter la réponse de Alpacha
cs_bouba 518 Messages postés dimanche 2 décembre 2001Date d'inscription 10 novembre 2007 Dernière intervention - 1 mars 2006 à 23:48
0
Utile
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.
Commenter la réponse de cs_bouba
Alpacha 95 Messages postés mardi 9 mars 2004Date d'inscription 20 mars 2006 Dernière intervention - 1 mars 2006 à 23:50
0
Utile
Ah c'est bien la pile :)
Bon courage à l'auteur du post, maintenant qu'il a la piste à suivre
Commenter la réponse de Alpacha

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.