Fonction à nbr d'arguments variable

Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007 - 22 nov. 2005 à 19:27
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007 - 23 nov. 2005 à 17:32
Bonjour.





Alors gros problème.
J'utilise des fonctions à nombres variables d'arguments. Alors je vais vous montré le code est expliqué aprés car je vois pas trop comment l'expliqué clairement.


bool get_bool(int type, ...) {
va_list varg;
va_start(varg, type);
bool ret = maclass::mafonction(type, varg);
va_end(varg);
return ret;
}

bool maclass::mafonction(int type, ...) {
va_list varg;
va_start(varg, type);
bool ret = false;


if (type == type1) {
const char* tmp = va_arg(varg, const char*);
const char* tmp2 = va_arg(varg, const char*);
ret = class2::mafonction2(tmp, tmp2);
}
va_end(varg);
return ret;
}

voila dans ce cas rien ne vas pas, les variables tmp et tmp2, non rien avoir avec ce qui est injecté dans la fonction get_bool(); normalement j'utilise aussi des pointeurs mais j'ai même pas esayé de voir si il était bon, voyant ce que sa peut donné avec des const char*.

voila merci de votre aide.

PS: si je fait des test dans la fonction get_bool() les valeurs sont bonne.

7 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 nov. 2005 à 21:32
Tu as vraiment besoin d'un nombre d'argument variable ? Si oui, utilise plutot le type "void*" plutot que "char*"



> http://www.cppfrance.com/code.aspx?ID10301
0
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
22 nov. 2005 à 22:28
rien y fait cela ne fonctionne pas. J'ai esayé :

char* tmp2 = (char*)va_arg(varg, void*);
et
const char* tmp2 = (const char*)va_arg(varg, void*);

je pense que le problème vien d'ici

bool ret = maclass::mafonction(type, varg);

comme si "varg" ne recopié pas bien les différents arguments.

________________
PS:
bool get_bool();
est en faite une fonction exporté dans une dll

PS2: J'aurait pas par hazard oublié d'inclure quelque chose ou faire une indication particulére au compilateur: j'ai seulement sa :


#define WIN32_LEAN_AND_MEAN // Exclure les en-têtes Windows rarement utilisés


// Fichiers d'en-tête Windows :


#include <windows.h>


#include <tchar.h>


#include <stdarg.h>
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
23 nov. 2005 à 00:23
Mais tu as un problème ici:

va_list varg;
va_start(varg, type);
bool ret = maclass::mafonction(type, varg);
va_end(varg);



je suis pas sur que tu peux utiliser varg comme ca. Il faut que tu
lises tous les objets un par un, puis tu appel ta fonction avec tout
les objets en arguments et non comme tu voudrais le faire, tout les a
arguments en un pointeur (ou je sais pas quoi).

Tu dois surement dabord récupérer les objets avec ca:

int obj;

obj = va_arg(listArg,
int
); <= enfin suivant le type d'objet que tu récupères.



Et après, tu fais maclass::mafonction(type, obj, obj2, obj3);



Mais tes sur d'avoir absolument besoin de faire ce genre de manipulation, ca sent plutot le plantage :)
0
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
23 nov. 2005 à 09:36
Je ne peut connaitre à l'avance le nombre total d'arguments vu que c'est une fonction exporté de dll.

bon par contre si je fait :

maclass::mafonction(type, va_arg(varg, void*), va_arg(varg, void*), va_arg(varg, void*));

Je pense que cela devrais être ok. Par contre petit question est t'il possible de savoir le nombre de paramêtre à l'aide d'une petite fonction?
0

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

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
23 nov. 2005 à 12:58
Sans connaitre le nombre d'argument, je vois pas trop comment tu pourrais faire. dsl
0
ekinox17 Messages postés 66 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 18 janvier 2006
23 nov. 2005 à 13:41
moi j'ai une idee : si tu utilisai un tableau dans le lequel tu mettrai
tes variables et apres tu tu fai un sizeof(tableau) pour savoir le
nimbre de tes argument et tu passe le tableau dans ta fonction comme
parametre
0
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
23 nov. 2005 à 17:32
bon j'ai trouvé comment faire :

void* arg1 = va_arg(varg, void*);
void* arg2 = va_arg(varg, void*);
void* arg3 = va_arg(varg, void*);
void* arg4 = va_arg(varg, void*);
maclass::mafonction(type, arg1, arg2, arg3, arg4, va_arg(varg, void*));

Cela fonctionne sans problème même si la fonction n'a pas tout les arguments.
0
Rejoignez-nous