S'il vous plaît voir le code suivant:question Core.vararg, déchets produits sur les appels répétés de va_arg
import core.vararg, std.stdio;
void main() {
foo(1);
}
void foo(...) {
va_list arguments;
for(int i; i<10; ++i) {
va_copy(arguments, _argptr);
writeln(arguments," ", va_arg!(int)(arguments));
}
}
Sortie:
7FFF61F21AE0 1
7FFF61F21AE0 0
7FFF61F21AE0 4387892
7FFF61F21AE0 0
7FFF61F21AE0 38
7FFF61F21AE0 1643256688
7FFF61F21AE0 4387915
7FFF61F21AE0 1
7FFF61F21AE0 27734032
7FFF61F21AE0 1005847240
Comme vous pouvez le voir, var_arg est produit ordures. Le premier appel renvoie toujours la valeur correcte cependant.
Quel est le problème ici? Le code source pour core.vararg est très simple et je ne pouvais pas repérer quoi que ce soit qui change les données sous-jacentes à 7FFF61F21AE0
Ah, je vois. Je ne crois pas qu'un appel à va_start soit nécessaire pour utiliser core.vararg (il n'y en a pas dans les exemples ici: http://dlang.org/function.html). Cependant, il y a pour core.stdc.stdarg donc ça doit être ce qui m'arrive –
Non, quoi que je fasse, compilé en utilisant x86 ou x86_64 et en utilisant l'une ou l'autre syntaxe, le pointeur reste sur la même adresse mais va_arg lit les arguments séquentiellement et puis passe à la poubelle, malgré l'utilisation de va_copy. –