cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
12 mai 2009 à 17:57
le_papy
Messages postés15Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention 6 juillet 2009
-
6 juil. 2009 à 09:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
le_papy
Messages postés15Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention 6 juillet 2009 6 juil. 2009 à 09:43
Merci pour ton code, très intéressant, je m'apprête à le décortiquer!
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 12 mai 2009 à 21:42
euh si on veut...
considère simplement que les arguments sont stockés l'un après l'autre dans une zone de mémoire spéciale (la pile, qui sert à contenir variables locales, arguments et adresses de retour).
Le compilateur ne fait pas de différence entre arguments fixes et arguments optionnels, lors de l'appel de la fonction il se contente de tout empiler.
petit exemple, pour appeler Sum(2,1,3) :
__asm
{
...
push 3L;
push 1L;
push 2L;
call dword ptr[Sum];
...
}
Nenyan
Messages postés4Date d'inscriptiondimanche 24 février 2008StatutMembreDernière intervention12 mai 2009 12 mai 2009 à 18:07
Effectivement, ton petit bout de code m'éclaire bien =).
Donc si j'ai tout suivi, le ... est l'équivalent d'un tableau, dont le premier élément est stocké a l'adresse suivant directement celle ou est stockée n.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 12 mai 2009 à 17:57
Juste pour info, puisque tu dis avoir eu du mal à trouver, une petite variante pour l'utilisation d'arguments variables sans varlist :
il suffit de récupérer l'adresse mémoire du dernier argument fixe, de cette manière on peut accéder aux suivants par un pointeur.
par exemple, une fonction Sum(unsigned n,...) qui additionne n entiers :
6 juil. 2009 à 09:43
12 mai 2009 à 21:42
considère simplement que les arguments sont stockés l'un après l'autre dans une zone de mémoire spéciale (la pile, qui sert à contenir variables locales, arguments et adresses de retour).
Le compilateur ne fait pas de différence entre arguments fixes et arguments optionnels, lors de l'appel de la fonction il se contente de tout empiler.
petit exemple, pour appeler Sum(2,1,3) :
__asm
{
...
push 3L;
push 1L;
push 2L;
call dword ptr[Sum];
...
}
12 mai 2009 à 18:07
Donc si j'ai tout suivi, le ... est l'équivalent d'un tableau, dont le premier élément est stocké a l'adresse suivant directement celle ou est stockée n.
12 mai 2009 à 17:57
il suffit de récupérer l'adresse mémoire du dernier argument fixe, de cette manière on peut accéder aux suivants par un pointeur.
par exemple, une fonction Sum(unsigned n,...) qui additionne n entiers :
unsigned Sum(unsigned n,...)
{
unsigned *data=1+&n;
unsigned i,result=0;
for(i=0;i<n;i++) result+=data[i];
return result;
}
et on peut appeler Sum(2,1,1) ou Sum(3,1,4,178) ou ...
c'est sans doute ce que fait varlist implicitement.