C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problème Accès Tableau de (void*)

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Stochastic
Guest





PostPosted: Tue May 02, 2006 6:06 pm    Post subject: Problème Accès Tableau de (void*) Reply with quote



Bonjour,

Je cherche à faire passer à une fonction un ensemble de paramètres dont je ne connais pas le nombre et le type à l'avance (critère à optimiser dont les paramètres dépendent de la forme du critère). Pour obtenir un résultat assez général, je cherche alors à faire passer en paramètre de cette fonction critère un objet "paramètres".

Imaginons une fonction du type:
double My_Func(CParams aParams)
{ // Faire quelque chose avec aParams
}
Ici l'objet CParams est mon objet "paramètres". Pour simplifier, imaginons que je cherche à faire passer 1 double, 1 int et 1 objet CObject (précédemment défini) à ma fonction My_Func. Je réalise alors l'appel suivant:
CObject aObject;
// initialisation de aObject
CParams aParams;
aParams.Set(12.5, 14, aObject);
// (*1)
Où la fonction "Set" va me permettre de stocker le double, l'int et le CObject dans un tableau de void* (ceci afin de pouvoir avoir un tableau indépendant du type des données en entrée).

Voici alors ma fonction Set:
void CParams::Set(double aA, int aB, CObject aC)
{
iNbArgs = 3;

theArgs = (void **)calloc(iNbArgs, sizeof(void*));

theArgs[0] = &aA;
theArgs[1] = &aB;
theArgs[2] = &aC;

// (*2)
}
Soit par ailleurs la fonction GetDouble:
double GetDouble(int aIdx)
{
return (*(double*)theArgs[aIdx]);
}
Je fais alors les tests suivants :
- dans la fonction Set à la ligne // (*2)
printf("%f\n", GetDouble(0));
Resultat : 12.5
- dans le programme principal à la ligne // (*1)
printf("%f\n", aParams.GetDouble(0));
Resultat : 0.0
Le résultat ne produit pas alors le but recherché. Je n'arrive pas à comprendre pourquoi le tableau theArgs de void* ne contient plus rien dès lors que l'on est sorti de la fonction Set. J'ai du faire un erreur dans l'utilisation des pointeurs, mais je ne la vois pas.

Si quelqu'un a une idée ou une solution, je suis preneur.

Stochastic.


--
Stochastic

------------------------------------------------------------------------
Voir theme: http://www.frbox.net/viewtopic-564675.html

Envoyé de http://www.frbox.net
Back to top
Fabien LE LEZ
Guest





PostPosted: Tue May 02, 2006 7:07 pm    Post subject: Re: Problème Accès Tableau de (void*) Reply with quote



On Tue, 2 May 2006 16:11:58 +0200, Stochastic
<Stochastic.276y2m@no-mx.frbox.net>:

Quote:
Voici alors ma fonction Set:

Plusieurs problèmes ici, dont une erreur manifeste.

Quote:
void CParams::Set(double aA, int aB, CObject aC)

{
iNbArgs = 3;

theArgs = (void **)calloc(iNbArgs, sizeof(void*));

"calloc", c'est du C. Même si, stricto sensu, on peut les utiliser en
C++, je te conseille fortement d'utiliser new ou new[] à la place.

Mais même ceux-là, on peut généralement éviter de les utiliser.

En C++, un tableau, c'est std::vector<>, sauf si on a une bonne raison
d'utiliser autre chose.

Il faudrait donc écrire, dans la déclaration de ta classe, à la place
de "iNbArgs" et "theArgs" :
std::vector<void*> theArgs;

puis, dans ta fonction Set() :

theArgs.erase (theArgs.begin(), theArgs.end()); /* Vider le
tableau, si tu le juges nécessaire */

Quote:
theArgs[0] = &aA;

theArgs.push_back (&aA);
theArgs.push_back (&aB);

Sauf que... Ça ne marche pas.

Tu as écrit :
void CParams::Set(double aA, int aB, CObject aC)

"aA" est donc un objet de type "double", local à ta fonction. Au
moment où tu sors de la fonction, cet objet est détruit, et son
adresse, stockée dans le tableau, ne veut plus rien dire.

Il y a des moyens de contourner ce problème, en gérant plus finement
la durée de vie des objets, mais c'est casse-gueule.
Boost::any serait sans doute plus adapté qu'un "void*".


D'ailleurs, je ne comprends pas ta démarche : si la fonction chargée
de remplir le tableau, et la fonction qui l'utilise, connaissent
toutes les deux les types des éléments, pourquoi faire un tableau de
void* ?

Il serait tellement plus simple d'écrire :

class CParams
{
public:
struct LesElements
{
double aA;
int aB;
CObjet aC;
};
LesElements les_elements;

....
};
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.