Nombre d'arguments illimité. Pourquoi mon truc marche ?

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 31 oct. 2004 à 18:07
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 - 1 nov. 2004 à 15:08
Je comprend pas pourquoi cette fonction marche dans le cas ou je créer un objet de la facon suivante:

force_list list2(&test, &test2[0], &test2[1], &test2[2], &test2[3]);

On me dit sur internet, que dans ce cas la, c'est la catastrophe, puisque je n'ai pas mis NULL a la fin des arguments. Et pourtant la valeur de length (ici 4,ce qui correspond à 5 arguments) est correct. (Le fait de rajouter NULL a la fin des arguments donne le meme résultat)

force_list::force_list(interaction *force...)
{
va_list fl;
va_start(fl, force);
interaction *suivant;
length = 0;
while ( (suivant = va_arg(fl, interaction*))!=NULL)
{
length++;
}
va_end(fl);
}

J'utilise la condition NULL qui semble etre vérifiée, alors qu'il n'est pas présent.
Je comprend pas.

8 réponses

Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
31 oct. 2004 à 21:02
Je ne vois pas non plus pourquoi ça marche...si même pourquoi ça compile : tu mets force_list(interaction *force...) dans virgule entre "force" et tes points de suspension O_o

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 oct. 2004 à 21:35
les ... c'est pour le nombre d'argument variable
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
31 oct. 2004 à 21:46
Le fait que ca compile, c'est normal, puisque le code est correct. Mais faudrait quelqu'un qui connaisse comment est géré la mémoire lors du passage d'argument a une fonction. Autrement dis, est-ce que lors des passages d'arguments, il y a un NULL apres ceux ci pour signifier qu'il n'y en a pas d'autre. Je vois pas d'autres explications.

Mon livre sur l'assembleur parlait de ces passages d'arguments, mais il ne mentionne pas ce détail, donc il ne doit pas exister.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 oct. 2004 à 21:56
ca depend juste de l'etat de la pile à l'appel

quand tu appel une fonction tu copie les parametres sur la pile puis l'adresse de la valeur retour

si tu tombe toujours sur un NULL... elle retourne quoi ta fonction ?
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 oct. 2004 à 22:09
non en fait je crois plutot que c'est les variables locale apres, l'adresse retour est copiée avant les arguments
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
31 oct. 2004 à 23:25
dls, je sais ce que signifient les "..." mais ce que je ne comprends pas c'est l'absence de virgule entre eux et "force".
Par exemple printf est déclaré dans le genre :
void printf(char* str, ...);
et non :
void printf(char* str...);

Quant à la présence d'un NULL c'est clair que c'est pas logique...
Y'a un bon bouquin qui peut te détailler la convention d'appel C sous processeurs x86, là : http://www.drpaulcarter.com/pcasm/ (génial ce bouquin :)).

Enfin dans tous les cas je ne laisserais pas le code comme ça, parce que c'est pas dit que tous les compilos se comportent de la même manière...
A moins qu'un NULL soit placé automatiquement après les "..." par le compilo. Après tout pourquoi pas...ça serait pratique au fond :)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
1 nov. 2004 à 00:46
La fonction que j'ai mise ici n'est pas partielle. Vous avez du le remarquer, mais c'est un constructeur de la classe. Il initialise un tableau contenant les pointeurs sur tous les arguments passés en paramètres, ainsi que la longeur de ce tableau dans une autre variable.

Mais j'ai laisser tomber, je rencontrais des bugs de mémoires. Par exemple, un pointeur qui change d'adresse au cours de la fonction... bref. C'est bien ce que l'on me disait sur internet. Il faut éviter d'utiliser ce genre de passage d'arguments.

Merci pour votre aide, j'ai pris note du livre, je l'ai télécharger en pdf. Mais bon, tout en anglais ... :)
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
1 nov. 2004 à 15:08
Bonne résolution ^^
Pour le livre, c'est clai que c'est tout en anglais mais franchement ça vaut le coup, enfin c'est mon avis ;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
0
Rejoignez-nous