8Fermer10
Pen^2Le 15/06/2009 à 14:51
Zephyr (./5) :
Oui mais non, puisque j'imagine que le problème se trouve au moment où il doit appeler sa 2eme fonction. Si j'ai bien saisi, ça bloque ici :
void func1 (int a, ...)
{
    // init va_args

    func2 (/*comment écrire les arguments ici, puisqu'il y en a un nombre variable ?*/);
}

J'ai eu le même problème et j'ai du poster un topic sur yN il y a 5 ans (bonne chance pour le trouver grin), mais de mémoire personne n'a proposé de solution et j'ai fini par contourner avec une méthode crade sad

C'est exactement ça smile
Je vais essayer de trouver ton topic. Tu te souviens de la solution crade en question ?


squalyl (./6) :
Pen^2: en général une fonction a args variables est un wrapper sur la même fonction, mais qui utilise un va_list, du coup si tu veux un autre wrapper c'est plus facile de wrapper la fonction qui utilise déja un va_list

exemple:

void sprintf(char *buf, const char * format, ...)
{ va_list va;
va_start(va, format);
vsprintf(buf,format,va);
va_end(va);
}

du coup si tu veux wrapper sprintf, vaut mieux directement wrapper vsprintf
http://www.manpagez.com/man/3/vsprintf/

OK, je vois. Je vais regarder si un prototype de ce genre existe... smile
squalyl (./7) :
(cross, et je pense aussi qu'il faut passer par du crade, genre manipuler SP, ce qui ultra bof si le wrapper a des variables locales, et qui n'est pas portabe)

arg grin
Kevin Kofler (./8) :
En C/C++ standard, ce n'est pas possible de recréer des varargs à partir d'une va_list, c'est pour ça que les fonctions v* existent dans la stdio.

GCC permet de faire ça sous certaines conditions (assez contraignantes): http://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html.

Merci, je vais jeter un œil, mais il se trouve qu'en plus mon code doit être portable cheeky