pointeur de method ?? est ce que c'est possible?? [c/c++] - C++ - Programmation
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.
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 :
|
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
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
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 ?!)
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
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à
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 :
|
Code :
|
Marsh Posté le 23-03-2004 à 00:12:42
doucement
y a un peti problème, il faut juste un petit cast bien placé
Code :
|
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
ici, on pourrait donner les arguments template directement sinon
->
Code :
|
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
edit: ce n'est rien de compliqué, c'est juste un peu de logique
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 :
|
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 faut s'accrocher)
Sylvain.
Marsh Posté le 23-03-2004 à 01:08:50
ben c'est bon tout ça ... je comprends pas le problème ...
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 :
|
Marsh Posté le 23-03-2004 à 01:46:32
ok, je viens de comprendre ... si tu as boost (donné dans les bibliolinks)
Code :
|
Marsh Posté le 23-03-2004 à 01:49:01
cool, vu l'exemple, ca ressemble a ce qu'il me faut !!
je regarde ca
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
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
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.
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.
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
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
Marsh Posté le 23-03-2004 à 03:22:05
slvn a écrit : |
mais t'es con ou quoi ? c'est des template, y a pas à linker
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
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 : |
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...
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 :
|
Marsh Posté le 23-03-2004 à 11:05:37
ben t'as exactement la meme chose en tempalte et en mieux avec mem_fun*
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.
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 : |
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
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
Marsh Posté le 23-03-2004 à 17:19:50
slvn a écrit : hey Taz, arrete de t'embaler, |
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.
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 ??
Marsh Posté le 23-03-2004 à 18:09:56
slvn a écrit : ouias, frenchkiss a raison, j'ai jamais utilise la stl non plus. |
donc tu ne sais pas du tout ce que sont les templates .... JoelF à l'aide
juste une question en passant : pourquoi tu dis que tu fais du C++ alors qu'en fait tu fait du C ?
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++.
Marsh Posté le 23-03-2004 à 22:42:51
slvn a écrit : |
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++
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).
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. |
c'est bien ce que je dis : tu as raté un chapitre si tu as un jour appris la POO.
slvn a écrit : |
fonction membre, membre
slvn a écrit : |
j'espère que t'as bien gavé d'inline tout ça.
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