[c/c++] pointeur de method ?? est ce que c'est possible??

pointeur de method ?? est ce que c'est possible?? [c/c++] - C++ - Programmation

Marsh Posté le 22-03-2004 à 20:24:36    

hello,
 
je cherche a faire un truc plutot bizarre en C/C++,
mais je commence a avoir des doutes sur la possibilite de le faire:
 
supposons que j'ai une classe Voiture. cette classe a une methode "void demarrer()".
et il y a deux instances: voitureA, voitureB.
 
 
est ce que c'est possible de faire qq chose avec un pointeur de fonction  

Code :
  1. {
  2.   void (*ptrFunction) ();
  3.   ptrFunction = voitureA.demarrer;
  4.   printf("demarrer la voiture A: " );
  5.   (*ptrFunction)();
  6.  
  7.   ptrFunction = voitureB.demarrer;
  8.   printf("demarrer la voiture B: " );
  9.   (*ptrFunction)();
  10. }

Reply

Marsh Posté le 22-03-2004 à 20:24:36   

Reply

Marsh Posté le 22-03-2004 à 20:54:40    

Quelle est l'idée de manoeuvre ?

Reply

Marsh Posté le 22-03-2004 à 21:15:57    

l'idee c'est que la classe Voiture est deja ecrite, et qu'une instance est cree. (en fait 1 seule).
 
Je cherche a appeller des fonctions "on the fly" pour agir sur la classe, pendant qu'elle est en cours d'execution dans le framework.
 
je travaille avec VxWorks/Tornado (envirronement temps reel), et je peux vraiment acceder a pas mal de chose bas niveau. genre, si une fonction en C est definit globalment, je peux y acceder et l'executer on the fly.
 
le pb du C++, c'est que ce n'est pas des fonction, mais des methodes, donc je voudrais faire un lien - de la maniere la plus simple possible-  depuis une fonction C, vers la methode d'une instance C++.
 
en appelant ptrFunction,
je voudrais que  voitureA.demarrer() soit executer.
 
 

Reply

Marsh Posté le 22-03-2004 à 21:28:33    

déjà dit dans un sujet avec un titre quasi identique

Reply

Marsh Posté le 22-03-2004 à 21:59:32    

ouias,  
j'ai trouver ca
http://forum.hardware.fr/forum2.ph [...] subcat=386
 
c'est pas tout a fait ce que je veux faire.
au final, le code ecrit est:

Code :
  1. (obj.*a)();
  2.       (obj.*b)(42);
  3.       (obj.*c)();
  4.    
  5.       (ptr->*a)();
  6.       (ptr->*b)(42);
  7.       (ptr->*c)();


 
en fait, je chercherais a faire un lien depuis la fonction A().
vers "obj->method()";  
mais je sais pas si ca peut marcher, je suis en train de regarde le code asm du bazar :)

Reply

Marsh Posté le 22-03-2004 à 22:08:36    

non, pas l'asm, tu perds ton temps. regarde dans STL
 
http://www.sgi.com/tech/stl/mem_fun_t.html (et les 3 autres pages)
 
et ça ça marche bien

Reply

Marsh Posté le 22-03-2004 à 22:31:36    

ah ouais, en effet, ca l'air mieux.
 
juste une question, comment on fait pour utiliser la STL?? (je veux dire, pour la compilation, y a une librairie en +, des includes ?!)

Reply

Marsh Posté le 22-03-2004 à 22:33:45    

je viens de trouver des infos sur  
http://artis.imag.fr/~Xavier.Decor [...] ction.html
ok a priori, rien a cahnger pour la compilation
je vais voir ce que ca donne
thanks :jap:  

Reply

Marsh Posté le 22-03-2004 à 22:55:06    

ben regarde mon lien ... y ades exemples ... la STL cai des templates et c'est standard : cout en fait parti. t'as juste à inclure et voilà

Reply

Marsh Posté le 22-03-2004 à 23:47:34    

j'essaue de compiler ca avec g++ sous cygwin, mais je me prends de tonner d'erreurs:
 

Code :
  1. //
  2. // mem_fun example
  3. //
  4. #include <functional>
  5. #include <list>
  6. using namespace std;
  7. int main(void)
  8. {
  9.   int a1[] = {2,1,5,6,4};
  10.   int a2[] = {11,4,67,3,14};
  11.   list<int> s1(a1,a1+5);
  12.   list<int> s2(a2,a2+5);
  13.   // Build a list of lists
  14.   list<list<int>* > l;
  15.   l.insert(l.begin(),s1);
  16.   l.insert(l.begin(),s2);
  17.   // Sort each list in the list
  18.   for_each(l.begin(),l.end(),mem_fun(&list<int>::sort));
  19. }


 

Code :
  1. slvnCpp.cpp: In function `int main()':
  2. slvnCpp.cpp:65: error: no matching function for call to `
  3.    std::list<std::list<int, std::allocator<int> >*,
  4.    std::allocator<std::list<int, std::allocator<int> >*> >::insert(
  5.    std::_List_iterator<std::list<int, std::allocator<int> >*, std::list<int,
  6.    std::allocator<int> >*&, std::list<int, std::allocator<int> >**>,
  7.    std::list<int, std::allocator<int> >& )'
  8. /usr/include/c++/3.3.1/bits/list.tcc:88: error: candidates are:
  9.    std::_List_iterator<_Tp, _Tp&, _Tp*> std::list<_Tp,
  10.    _Alloc>::insert(std::_List_iterator<_Tp, _Tp&, _Tp*>, const _Tp& ) [with _Tp
  11.    = std::list<int, std::allocator<int> >*, _Alloc =
  12.    std::allocator<std::list<int, std::allocator<int> >*>]
  13. /usr/include/c++/3.3.1/bits/stl_list.h:831: error:                 void
  14.    std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp, _Tp&, _Tp*>,
  15.    unsigned int, const _Tp& ) [with _Tp = std::list<int, std::allocator<int> >*,
  16.    _Alloc = std::allocator<std::list<int, std::allocator<int> >*>]
  17. slvnCpp.cpp:66: error: no matching function for call to `
  18.    std::list<std::list<int, std::allocator<int> >*,
  19.    std::allocator<std::list<int, std::allocator<int> >*> >::insert(
  20.    std::_List_iterator<std::list<int, std::allocator<int> >*, std::list<int,
  21.    std::allocator<int> >*&, std::list<int, std::allocator<int> >**>,
  22.    std::list<int, std::allocator<int> >& )'
  23. /usr/include/c++/3.3.1/bits/list.tcc:88: error: candidates are:
  24.    std::_List_iterator<_Tp, _Tp&, _Tp*> std::list<_Tp,
  25.    _Alloc>::insert(std::_List_iterator<_Tp, _Tp&, _Tp*>, const _Tp& ) [with _Tp
  26.    = std::list<int, std::allocator<int> >*, _Alloc =
  27.    std::allocator<std::list<int, std::allocator<int> >*>]
  28. /usr/include/c++/3.3.1/bits/stl_list.h:831: error:                 void
  29.    std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp, _Tp&, _Tp*>,
  30.    unsigned int, const _Tp& ) [with _Tp = std::list<int, std::allocator<int> >*,
  31.    _Alloc = std::allocator<std::list<int, std::allocator<int> >*>]
  32. slvnCpp.cpp:69: error: no matching function for call to `mem_fun(<unknown type>
  33.    )'
  34. slvnCpp.cpp:69: error: `for_each' undeclared (first use this function)
  35. slvnCpp.cpp:69: error: (Each undeclared identifier is reported only once for
  36.    each function it appears in.)


 
 

Reply

Marsh Posté le 22-03-2004 à 23:47:34   

Reply

Marsh Posté le 23-03-2004 à 00:12:42    

doucement :D
 
y a un peti problème, il faut juste un petit cast bien placé
 

Code :
  1. #include <functional>
  2. #include <list>
  3. #include <algorithm>
  4. using namespace std;
  5. namespace
  6. {
  7.   template<typename T, size_t N>
  8.   inline const T * begin(const T (&tab)[N])
  9.   {
  10.     return tab;
  11.   }
  12.   template<typename T, size_t N>
  13.   inline const T* end(const T (&tab)[N])
  14.   {
  15.     return tab + N;
  16.   }
  17. }
  18. int main()
  19. {
  20.   typedef std::list<int> Li;
  21.   int a1[] = {2,1,5,6,4};
  22.   int a2[] = {11,4,67,3,14};
  23.   Li s1(begin(a1), end(a1));
  24.   Li s2(begin(a2), end(a2));
  25.   list< Li > l;
  26.   l.push_front(s1);
  27.   l.push_front(s2);
  28.   for_each(l.begin(), l.end(),
  29.    mem_fun_ref(static_cast<void (Li::*)()>(&Li::sort))
  30.    );
  31. }

Reply

Marsh Posté le 23-03-2004 à 00:17:48    

bon voilà, maintenant, je t'explique le pourquoi du cast.
 
quand tu utilises une fonction template, sans spécifier ses arguments, le compilateur doit faire une déduction. mais ça n'est pas toujours possible. std::list à deux méthodes sort, donc ton compilateur ne sait pas laquelle utiliser.
 
alors on cast pour lui donner l'information :D
ici, on pourrait donner les arguments template directement sinon
 
->

Code :
  1. mem_fun_ref<void, Li>(&Li::sort)

cai faisable parce que mem_fun_ref n'a pas beaucoup d'arguments ... mais s'il y en avait plus, le static_cast est nettement plus concis et surtout, sans danger ... s'il y a un problème, il est soulevé à la compilation. en fait, on ne cast rien, on dit juste au compilateur quoi utiliser :D
 
 
edit: ce n'est rien de compliqué, c'est juste un peu de logique


Message édité par Taz le 23-03-2004 à 00:26:04
Reply

Marsh Posté le 23-03-2004 à 00:58:41    

tout n'est pas clair encore pour moi en cpp, mais j'ai bien capte le pb en question de l'exemple:)
 
par contre, je me rend compte que ca correspond pas a ce que je recherche.
 
je souhaite, qu'en appelant  
la fonction.  
 
Hello()
 
ca appelle directment:  instance345->Method();
 
(sans avoir a l'implementer, ie: je ne veux pas:
Hello(){instance345->method();}
 
le nec plus ultra serait qq chose du type

Code :
  1. void Hello();
  2. ...
  3. Hello = instance345->method;
  4. ...
  5. Hello();  //equivalent~ instance345->method();


 
 
en fait, je pense que c'est pas si simple de part la maniere dont c++ fonctionne.
 
merci en tout pour test explication:) (ps tjrs facile a comprendre :D faut s'accrocher)
 
Sylvain.

Reply

Marsh Posté le 23-03-2004 à 01:08:50    

ben c'est bon tout ça ... je comprends pas le problème ...

Reply

Marsh Posté le 23-03-2004 à 01:40:35    

Taz a écrit :

ben c'est bon tout ça ... je comprends pas le problème ...


 
l'exemple est choppe d'un site web, je voulais tester avec qq chose qui compile bien.
 
le probleme, c'est que nul part, les functions/templates mem_fun_xxx ne referent a l'instance dont je veux appeler les methodes.  
 
est ce qu'on peut partir d'un exemple simple + simple:
 

Code :
  1. #include "stdio.h"
  2.   #include "stdlib.h"
  3.    
  4. class A {
  5.    private:
  6.    int value;
  7.  
  8.    public:
  9.    void method() { printf( "a: %d\n", value ); };
  10.  
  11.    A(int x){value=x;}; 
  12.    ~A(){};
  13. };
  14. int main(){
  15.    A * a1 = new A(1);
  16.    A * a2 = new A(2);
  17.  
  18.    a1->method();
  19.    a2->method();
  20.  
  21.    void f();
  22.  
  23.    f = mem_fun_ref_t<void, A>( &A::method ); //ici on a pas de rapport avec l'instance a1 ni a2 ?? donc comment, si j'appelle la fonction f, je vais pouvoir distinquer a1->method(), de a2->method()???
  24.  
  25.  
  26.    return 0;
  27.   }


Reply

Marsh Posté le 23-03-2004 à 01:46:32    

ok, je viens de comprendre ... si tu as boost (donné dans les bibliolinks)
 

Code :
  1. #include <boost/function.hpp>
  2. #include <boost/bind.hpp>
  3. #include <iostream>
  4. struct Foo
  5. {
  6.   void bar() { std::cout << "Spam\n"; }
  7. };
  8. int main()
  9. {
  10.   Foo foo;
  11.   boost::function<void ()> hello = boost::bind(&Foo::bar, &foo);
  12.   hello();
  13.   hello();
  14.   hello();
  15. }

Reply

Marsh Posté le 23-03-2004 à 01:49:01    

cool, vu l'exemple, ca ressemble a ce qu'il me faut !!
je regarde ca:)

Reply

Marsh Posté le 23-03-2004 à 01:59:59    

en fait y a des trucs pour binder et faire des objet fonction dans STL, mais c'est trop limité pour le moment ... mais dans boost, y a de tout : plus il intégrerons boost dans STL à la prochaine révision, mieux ça sera

Reply

Marsh Posté le 23-03-2004 à 02:04:28    

sinon tu sais, si le nom de la méthode que tu veux appeler ne change pas, si c'est toujours la même, operartor() convient bien

Reply

Marsh Posté le 23-03-2004 à 02:23:38    

la stl, c'est une library a part ?!
je sais pas la taille de boost, mais je pense que ca va pas le faire: il s'agit d'un system embarque (dvdplayer/recorder) je qu'il vont faire la gueule ici si je leur annoncer que je met une lib 1 mo :))
 
en fait, il y a surment une centaine de fonction a binder. voire plus, et il faudrait meme que ca soit faisable de maniere simple.
 
je vais essaye de faire un truc + simple. genre une petite appli facilement modifiable, sinon je vais pas m'en sortir.

Reply

Marsh Posté le 23-03-2004 à 02:26:43    

ah ah
 
tu connais une bibliothèque qui soit pas à part ? et boost c'est des template pour la majeur partie, alors une fois que c'est compilé, le binaire se suffit à lui même.

Reply

Marsh Posté le 23-03-2004 à 02:27:38    

si tu as autant de truc à lié c'est que y a peut être un problème dans le design : ça veut dire que finalement, ton instance tu t'en fout, ... et là je suis plus

Reply

Marsh Posté le 23-03-2004 à 03:18:49    


en fait, je sais pas tout simplement si la STL est linker au projet. a mon avis, y a des grande chance pour qu'elle le soit pas vu que la memoire est limite sur le target.
 
hum hum hum, sinon spa mon design. c'est un projet qui va bientot avoir une dizaine d'annee je pense :) donc y a des couches par dessus d'autre couche. parfois c'est un joli merdier:)
 
en fait, l'instance en question est un navigateur (VRNavigator).
et est inclu dans un framework de tests. le pb, c'est qu'exposer tout les fonctionnalites du Navigateur en haut du framework est assez stupide a mon avis et augmenter pas mal la complexite.  
ce que je voudrais faire, c'est exposer cette classe directement.
si les methodes avaient ete globales en C++ ca aurait ete super simple. (Avec VxWork tu peux appeler les fonction on the fly, mais la en C++ c'est plus reloud car elle dependes du context/instance, bref...)
 
le problem, en fait, c'est qu'il faut tester un composant en particulier dans l'ensemble du framework car c'est important pour son comportement, et pour le risque de bugs. mais ce que je cherche a eviter c'est d'augmenter la complexiter de la couche superieur :)
 

Reply

Marsh Posté le 23-03-2004 à 03:22:05    

slvn a écrit :


en fait, je sais pas tout simplement si la STL est linker au projet. a mon avis, y a des grande chance pour qu'elle le soit pas vu que la memoire est limite sur le target.

mais t'es con ou quoi ? c'est des template, y a pas à linker :o

Reply

Marsh Posté le 23-03-2004 à 09:54:16    

oky, je me suis laisse avoir par le terme library :/
je me repenche demain, surtout sur boost, si y a pas de linkage, donc si ca n'augment en rien la taille du binaire, ca va m'interesser :)
 

Reply

Marsh Posté le 23-03-2004 à 10:19:58    

slvn a écrit :

oky, je me suis laisse avoir par le terme library :/


 
je vois pas de différence : qu'une bibliohtèque soit sous forme de code objet ou de template / fonction inline, ça reste une bibliothèque

slvn a écrit :


 
 
je me repenche demain, surtout sur boost, si y a pas de linkage, donc si ca n'augment en rien la taille du binaire, ca va m'interesser :)

si tu veux je te passe le code d'une fonction qui réduit la taille du binaire... c'est définitif, t'es idiot, tu ferais bien de revoir tes bases de compilation...

Reply

Marsh Posté le 23-03-2004 à 11:01:50    

et ca t'interresserai pas de faire ( si tu veux changer "on the fly" la methode a tester sur ton objet..)
 

Code :
  1. voif demarrerCallback(voiture* v){ v->demarre();}
  2. void klaxonneCallback(voiture* v){ v->klaxonne();}
  3. void (*ptrFunction) (voiture*);
  4.   ptrFunction = demarrerCallBack; 
  5.   printf("demarrer la voiture A: " );
  6.   (*ptrFunction)(voitureA);
  7.   printf("demarrer la voiture B: " );
  8.   (*ptrFunction)(voitureB);
  9.   ptrFunction = klaxonnerCallBack; 
  10.   printf("faire klaxonner la voiture A: " );
  11.   (*ptrFunction)(voitureA);
  12.   printf("faire klaxonner la voiture B: " );
  13.   (*ptrFunction)(voitureB);


 

Reply

Marsh Posté le 23-03-2004 à 11:05:37    

ben t'as exactement la meme chose en tempalte et en mieux avec mem_fun*

Reply

Marsh Posté le 23-03-2004 à 11:37:54    

oui mais comme il a l air de bloquer un peu avec la STL , et que boost le penaliserai ( au niveau taille je parle),  
c proposition alternative , et on sait jamais ca peut lui donner d autres idées.

Reply

Marsh Posté le 23-03-2004 à 11:41:52    

frenchkiss a écrit :

oui mais comme il a l air de bloquer un peu avec la STL , et que boost le penaliserai ( au niveau taille je parle),

le fait est que qu'il n'a aucune idée de ce qu'est une bibliothèque et la compilation
 

frenchkiss a écrit :


c proposition alternative , et on sait jamais ca peut lui donner d autres idées.
 

supair ton alternative, c'est le première que j'ai dite. mais bon il est pas content ... ça sent la masturbation de programmeur C qui veut a foutu des trucs dans des classes au petit bonheur la chance, seulement maintenant, il veut plus des classes

Reply

Marsh Posté le 23-03-2004 à 17:01:01    

hey Taz, arrete de t'embaler,
 
une library qui fait 1 mo, et qui doit est linke, va au final augment la taille du binaire d'environ 1 mo, correct ?
 
quand tu dis library,comme tu precises rien, c'est que tu parle de qq chose a linker. sinon dis template library. (comme dnas STL) on evitera toute confusion.
 
Comme au final, boost est une template library, ca n'aura surement pas de pb majeur au niveau de la taille au final.
 
bref, sinon, y a 150 personnes a travailler sur un software.. faudrait que t'essayes de comprendre que tout n'est pas simple et facil a faire pour rester dans l'architecture du projet. y a des parties, qui sont releases, d'autre en production, d'autre developpe a 1000 bornes, d'autre qui attendent un support pour le customer. si c'etait aussi simple de changer la conception d'un software en faisant ca dans son coin, je pense que ca se saurait.
 
merci quand meme pour tout l'aide que tu m'as apporte :jap:

Reply

Marsh Posté le 23-03-2004 à 17:19:50    

slvn a écrit :

hey Taz, arrete de t'embaler,
 
une library qui fait 1 mo, et qui doit est linke, va au final augment la taille du binaire d'environ 1 mo, correct ?
 
quand tu dis library,comme tu precises rien, c'est que tu parle de qq chose a linker. sinon dis template library. (comme dnas STL) on evitera toute confusion.
 
Comme au final, boost est une template library, ca n'aura surement pas de pb majeur au niveau de la taille au final.


 
t'as mis un sacré bout de temps à le comprendre ... genre quand tu vois le mot template partout, tu peux pas te douter ni que STL, ni que boost sont des bibliothèques template.

Reply

Marsh Posté le 23-03-2004 à 18:08:17    

ouias, frenchkiss a raison, j'ai jamais utilise la stl non plus.
 
dans la maniere de fonctionner, les templates vont etres transformes en C/C++ comme du pre-processing?! comme les #define &co  ... donc on peut voir le fichier generer avec: g++ -E ??

Reply

Marsh Posté le 23-03-2004 à 18:09:56    

slvn a écrit :

ouias, frenchkiss a raison, j'ai jamais utilise la stl non plus.
 
dans la maniere de fonctionner, les templates vont etres transformes en C/C++ comme du pre-processing?! comme les #define &co  ... donc on peut voir le fichier generer avec: g++ -E ??
 

donc tu ne sais pas du tout ce que sont les templates .... JoelF à l'aide :o
 
juste une question en passant : pourquoi tu dis que tu fais du C++ alors qu'en fait tu fait du C ?


Message édité par Taz le 23-03-2004 à 18:10:39
Reply

Marsh Posté le 23-03-2004 à 18:31:22    

en details:
 
 
le projet est fait en asm/c/c++
 
asm/c, c'est pour une library. le partie en c++ c'est :
 
-la couche applications
-un system de messaging, intra application et pour des notifications.  
-une couche pour faire marcher plusieur application de maniere concurrente, ainsi que pour tester.
-puis encore une couche de messaging, a la fois pour le target et pour la communication target/host.
 
cette couche de test, permet "certains" tests, oriente "utilisateur", ces tests sont effectue par un service  de la boite. mais ils ne sont pas assez exhaustif (c'est pas leur but), et on veut que n'importe qui puisse tester une des applications de maniere minutieuse, c'est a dire n'importe qu'elle des fonctionnalites de l'application. (ce que j'appel application, c'est en partie la class dont j'essaye de recupperer les methodes).
 
le moyen le plus, a mon sens, pour agir sur cette classe/instance. c'est de posseder une fonction qui appel instance->method.
tout simplemement car l'envirronement de developpement embarque, permet d'appeler ces fonctions on the fly.
 
 
donc, voila pourquoi je dois travailler avec du c++.


Message édité par slvn le 23-03-2004 à 18:32:43
Reply

Marsh Posté le 23-03-2004 à 22:42:51    

slvn a écrit :


donc, voila pourquoi je dois travailler avec du c++.

ben alors fait le, parce que si ton seul avantage, c'est la syntaxe d'appel de fonction membre ... en C t'aurais pu faire comme BSD SleepyCat  obj->f(obj, param1, param2, ...)
 
quitte à utiliser le C++ autant apprendre le C++

Reply

Marsh Posté le 23-03-2004 à 23:48:46    

en fait, j'escontais plus qq chose que l'avantage de la syntaxe, et c'est pour ca que je voulais regarder le code asm.
j'aurais aime un recopiage d'adresse, genre:  
ma_fonction = instance->methode;
mais bon, en fait ca le fait pas.
 
des trucs obj->(obj, param1, param2, ) c'est exactement ce qu'il y a en fait dans la couche C. (c'est en C, mais oriente object de cette maniere, avec les notions de classe, heritage, public, prive, method, field ).
 
je vais faire un script pour me generer le code.
et faire des fonctions du style.
 
ma_fonction_blabla( p1, p2) {
   MaClasse::getInstance()->blabla( p1, p2);
}
 
getInstance, etant une methode static qui donnne la derniere instance cree. (de tte facon il n y en a qu'une seule a chaque fois en meme temps, donc je peux mette un champs static dans la class pour memoriser l'instance).
 

Reply

Marsh Posté le 23-03-2004 à 23:53:07    

slvn a écrit :

en fait, j'escontais plus qq chose que l'avantage de la syntaxe, et c'est pour ca que je voulais regarder le code asm.
j'aurais aime un recopiage d'adresse, genre:  
ma_fonction = instance->methode;
mais bon, en fait ca le fait pas.


c'est bien ce que je dis : tu as raté un chapitre si tu as un jour appris la POO.

slvn a écrit :


des trucs obj->(obj, param1, param2, ) c'est exactement ce qu'il y a en fait dans la couche C. (c'est en C, mais oriente object de cette maniere, avec les notions de classe, heritage, public, prive, method, field ).


fonction membre, membre

slvn a écrit :


je vais faire un script pour me generer le code.
et faire des fonctions du style.
 
ma_fonction_blabla( p1, p2) {
   MaClasse::getInstance()->blabla( p1, p2);
}
 
getInstance, etant une methode static qui donnne la derniere instance cree. (de tte facon il n y en a qu'une seule a chaque fois en meme temps, donc je peux mette un champs static dans la class pour memoriser l'instance).

j'espère que t'as bien gavé d'inline tout ça.

Reply

Marsh Posté le 24-03-2004 à 00:20:54    

merci pour tes remarques constructives.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed