Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1273 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

pointeur de fonction membre d'une classe

n°762126
Taz
bisounours-codeur
Posté le 13-06-2004 à 22:16:07  profilanswer
 

Reprise du message précédent :
ben flfhdfhqfhflmdhfsqdhmlfqsdfsq c'est aussi compréhensible de prime abord que pfdl

mood
Publicité
Posté le 13-06-2004 à 22:16:07  profilanswer
 

n°762180
HelloWorld
Salut tout le monde!
Posté le 13-06-2004 à 22:49:49  profilanswer
 

Taz a écrit :

ben flfhdfhqfhflmdhfsqdhmlfqsdfsq c'est aussi compréhensible de prime abord que pfdl


Huhu. Venant d'un défenseur d'un système ou le nom des commandes ne dépasse pas 3 lettres c'est assez marrant.
(Troll inside, mais c'est de la Taz provoc, ne pas répondre).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°762396
cricri_
Posté le 14-06-2004 à 08:21:00  profilanswer
 

ben pf pour pointeur de fonction, et Dlg pour Dialog, j'aurai  pû rajouter Box ;)

n°762400
docmaboul
Posté le 14-06-2004 à 08:33:53  profilanswer
 

Taz a écrit :

et comment veut tu que ça soit possible ?


 
Comme ça:

Code :
  1. class CProut
  2. {
  3. public:
  4. CProut()
  5. {
  6.  a=123;
  7.  b=456;
  8. }
  9. void func(int c);
  10. void func2();
  11. int  func3();
  12. int a,b;
  13. };
  14. void CProut::func(int c)
  15. {
  16. fprintf(stderr, "a=%d, b=%d, c=%d\n",a,b,c);
  17. a=314;b=159;
  18. }
  19. void CProut::func2()
  20. {
  21. fprintf(stderr, "a=%d, b=%d\n",a,b);
  22. a=123;b=456;
  23. }
  24. int CProut::func3()
  25. {
  26. return b;
  27. }
  28. typedef void (CProut::*MY_PTR_FUNC)(int);
  29. typedef void (CProut::*MY_PTR_FUNC2)(void);
  30. typedef int (CProut::*MY_PTR_FUNC3)(void);
  31. void test_of_the_prout(CProut * prout)
  32. {
  33. int n;
  34. MY_PTR_FUNC ptrFunc=CProut::func;
  35. MY_PTR_FUNC2 ptrFunc2=CProut::func2;
  36. MY_PTR_FUNC3 ptrFunc3=CProut::func3;
  37. // appel de func sur prout en passant 3 en parametre
  38. __asm {
  39.  PUSH 3
  40.  MOV ECX, prout
  41.  CALL ptrFunc;
  42. }
  43. // appel de func2 sur prout (pas de parametre)
  44. __asm {
  45.  MOV ECX, prout
  46.  CALL ptrFunc2;
  47. };
  48. // appel de func3 sur prout (pas de parametre) et affectation du résultat à n
  49. __asm {
  50.  MOV ECX, prout
  51.  CALL ptrFunc3;
  52.  MOV n, EAX
  53. }
  54. fprintf(stderr, "%d\n", n);
  55. }


 
D'accord, c'est un poil sauvage comme méthode mais dans son cas, cela devrait bien marcher :D

n°762414
cricri_
Posté le 14-06-2004 à 09:15:49  profilanswer
 

Heuuh ... merci mais j'évite au max l'asm ... ;)

n°762419
HelloWorld
Salut tout le monde!
Posté le 14-06-2004 à 09:31:19  profilanswer
 

DocMaboul a écrit :

Comme ça:
[...]
D'accord, c'est un poil sauvage comme méthode mais dans son cas, cela devrait bien marcher :D


Mouhaha. Si Taz n'a pas répondu c'est qu'il est mort d'un arrêt cardiaque. Deja le code cpp, + pas besoin d'asm pour faire ce que tu fais (a quoi ça sert de pouvoir déclarer un pointeur sur fonction membre en C++ si on peut pas l'appeler en C++ mais que en asm ?) mais surtout : tu résouds rien.
Ecris plutot une fonction test_of_the_prout qui recoit en paramètre un pointeur de fonction membre et apelle la fonction, sans rien connaitre de l'instance de classe concernée...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°762439
Taz
bisounours-codeur
Posté le 14-06-2004 à 09:52:53  profilanswer
 

HelloWorld a raison

n°762490
docmaboul
Posté le 14-06-2004 à 10:38:17  profilanswer
 

Taz a écrit :

HelloWorld a raison


 
Mea culpa, c'est vrai que cela revient au même. Par contre, ce que je ne comprends pas dans ta notation, c'est que "." est un opérateur de sélection de membre. On m'aurait menti???

n°762512
Taz
bisounours-codeur
Posté le 14-06-2004 à 10:53:14  profilanswer
 

oui. dans le cadre de pointeur fonction de membre, ça n'a pas la même signification ce qui est somme toute logique

n°762532
docmaboul
Posté le 14-06-2004 à 11:10:25  profilanswer
 

Taz a écrit :

oui. dans le cadre de pointeur fonction de membre, ça n'a pas la même signification ce qui est somme toute logique


 
Oui, j'avais compris mais surréaliste me semble plus approprié que logique:
 
http://imagecache2.allposters.com/images/AWI/f956-magritte.jpg


Message édité par docmaboul le 14-06-2004 à 11:11:00
mood
Publicité
Posté le 14-06-2004 à 11:10:25  profilanswer
 

n°762765
cricri_
Posté le 14-06-2004 à 14:22:29  profilanswer
 

Bon, je continue sur ma lancée avec mes windowseries ...
voilà je me dit qu'au lieu d'utiliser un pointeur de fonction,   pourquoi ne pas passer en argumant de la fonction directement le bon pointeur, plutôt que de passer this en argument et en ayant initialisé un pointeur de fonction membre.
Mais le pb c'est que j'ai droit à des injures quand je cherche à caster ce pointeur de fonction en long, qui est le paramètre réservé (user).
 

n°762769
Taz
bisounours-codeur
Posté le 14-06-2004 à 14:29:27  profilanswer
 

parce qu'un pointeur de fonction memebre est quelque chose de très différent

n°762779
cricri_
Posté le 14-06-2004 à 14:34:51  profilanswer
 

Très différent dans quel sens ?  
Ce n'est pas qu'un simple pointeur ?
Donc ce coup-ci tu es en train de me dire que ce n'est vraiment pas possible.

n°762799
bahloul
Posté le 14-06-2004 à 14:49:08  profilanswer
 

Comment utiliser un flex et un byacc dans une application win32 console supportant les classes MFC.

n°762809
Taz
bisounours-codeur
Posté le 14-06-2004 à 14:53:24  profilanswer
 

cricri_ a écrit :

Très différent dans quel sens ?  
Ce n'est pas qu'un simple pointeur ?
Donc ce coup-ci tu es en train de me dire que ce n'est vraiment pas possible.

non ça n'est pas un simple pointeur loin de là

n°762811
Taz
bisounours-codeur
Posté le 14-06-2004 à 14:53:44  profilanswer
 

bahloul a écrit :

Comment utiliser un flex et un byacc dans une application win32 console supportant les classes MFC.

ta gueule :o

n°762814
HelloWorld
Salut tout le monde!
Posté le 14-06-2004 à 14:54:49  profilanswer
 

bahloul a écrit :

Comment utiliser un flex et un byacc dans une application win32 console supportant les classes MFC.


C'est quoi cette mode de poser ses questions au milieu d'un thread ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°762836
HelloWorld
Salut tout le monde!
Posté le 14-06-2004 à 15:01:11  profilanswer
 

cricri_ a écrit :

Bon, je continue sur ma lancée avec mes windowseries ...
voilà je me dit qu'au lieu d'utiliser un pointeur de fonction,   pourquoi ne pas passer en argumant de la fonction directement le bon pointeur, plutôt que de passer this en argument et en ayant initialisé un pointeur de fonction membre.
Mais le pb c'est que j'ai droit à des injures quand je cherche à caster ce pointeur de fonction en long, qui est le paramètre réservé (user).


Probleme super classique en Win32. Ce n'est pas la méthode qu'il faut associer à ta fenêtre mais l'instance de ta classe. Puis tu récupères ton instance de classe MaClasse * ma_classe quand il le faut et tu appeles ta fonction ma_classe->Fonction();.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°762868
docmaboul
Posté le 14-06-2004 à 15:08:14  profilanswer
 

Taz a écrit :

non ça n'est pas un simple pointeur loin de là


 
http://is.lse.ac.uk/staff/sorensen/downloads/not/pipe.jpg
 
:D :D :D


Message édité par docmaboul le 14-06-2004 à 15:10:15
n°762890
Taz
bisounours-codeur
Posté le 14-06-2004 à 15:12:19  profilanswer
 

ahah, ben peut être tu ferais bien de te rappeler wue notre cher ami pointeur de fonction membre il est lié à la vtable de l'instance avec lequel on l'appelle. un pointeur de fonction membre n'est pas convertible en void*

n°762926
cricri_
Posté le 14-06-2004 à 15:21:01  profilanswer
 

Ok, merci.
HelloWorld : vi, c'est juste ce que j'essayais de faire avant cette question si tu relis le topic ;)
En fait je trouvais plus simple de passer directement le bon pointeur de fonction, surtout dans mon cas puisque la fontion appelée elle ne connait pas la bonne fonction à appeler..
 
Bon, ben je vais garder mon pointeur de fonction membre, pis c'est vrai que cela aurait été dommage vu le mal que certain se sont donné pour essayer de me faire avaler ce truc infame  :whistle:  

n°762964
HelloWorld
Salut tout le monde!
Posté le 14-06-2004 à 15:27:56  profilanswer
 

cricri_ a écrit :

Ok, merci.
HelloWorld : vi, c'est juste ce que j'essayais de faire avant cette question si tu relis le topic ;)
En fait je trouvais plus simple de passer directement le bon pointeur de fonction, surtout dans mon cas puisque la fontion appelée elle ne connait pas la bonne fonction à appeler..


Ben normalement la fonction callback que tu donnes est la fonction d'aiguillage qui va récupérer l'instance de ta classe et appeler la bonne fonction membre.
Ce qui est fait aussi mais qui est plus balaize est de créer dynamiquement ta fonction callback (thunking). Tu alloues de la mémoire exécutable, tu places les opcodes pour appeler ta fonction membre, et tu files ça en paramètre callback...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°762996
cricri_
Posté le 14-06-2004 à 15:36:56  profilanswer
 

Houlà ... ça parait balaise ça, t'aurais une URL ou un endroit qui explique ça un peu plus en détail ?

n°763007
HelloWorld
Salut tout le monde!
Posté le 14-06-2004 à 15:41:38  profilanswer
 

Ben j'ai croisé ça dans du code.
OWL si je me souviens bien.
Y'a ATL qui le fait aussi il me semble.
En fait c'est encore plus balaise car c'est à base de template...
cf CWndProcThunk


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°764789
cricri_
Posté le 15-06-2004 à 18:54:49  profilanswer
 

Un truc bizarre avec ce pointeur de fonction membre, si je le déclare public j'ai ce warning :
Compressor.h(82) : warning C4121: 'CCompressor' : l'alignement d'un membre était sensible à la compression
pas de pb s'il est déclaré private, une idée ?
Qu'est-ce que ça veut dire exactement ?
Enfin je comprends le message d'erreur, mais je pige pourquoi il s'applique dans ce cas. A noter que j'ai laisser l'alignement par défaut, donc 8 je crois.
..
curieux, je remets public: avant et plus de warning ...


Message édité par cricri_ le 15-06-2004 à 18:56:18
n°764791
Taz
bisounours-codeur
Posté le 15-06-2004 à 18:55:48  profilanswer
 

? t'as fait un struct pour dégager les octets de bourrage ?

n°764792
cricri_
Posté le 15-06-2004 à 18:56:55  profilanswer
 

non, il est déclaré à la suite des fonctions public de la classe

n°764796
Taz
bisounours-codeur
Posté le 15-06-2004 à 18:59:44  profilanswer
 

je te parle au niveau des réglages de ton compilateur :o
 
 
edit : vu ton edit, oui, alors cherche pas ailleurs :o


Message édité par Taz le 15-06-2004 à 19:00:17
n°764827
cricri_
Posté le 15-06-2004 à 19:17:45  profilanswer
 

Suis pas sûr de comprendre ...
Une classe c'est comme une structure, non ?
...
Est-ce que ça veut dire qu'il faut que je mette l'alignement à 4 pour pouvoir accéder à ce pointeur ?

n°764910
cricri_
Posté le 15-06-2004 à 21:17:15  profilanswer
 

Et dans quel cas faudrait-il que je fasse une structure pour dégager les octets de bourrage ?
C'est que j'ai envie de me coucher moins bête ce soir .. ;)

n°764916
Taz
bisounours-codeur
Posté le 15-06-2004 à 21:20:49  profilanswer
 

ne touche pas à l'alignement bordel :o
l'alignement dépend du type de données, le forcer peut poser des gros problèmes

n°764946
cricri_
Posté le 15-06-2004 à 21:36:40  profilanswer
 

vi, mais normalement c'est lié aux membres d'une structure, on aligne sur le membre ayant la contrainte d'alignement la plus importante.
J'imagine, à tord peut-être, que modifier l'alignement au niveau compilo force cet alignement, au même titre que l'instruction pragma pack, non ?
En tout cas ça n'explique pas vraiment mon message ...

n°764948
Taz
bisounours-codeur
Posté le 15-06-2004 à 21:37:41  profilanswer
 

non. on aligne pas tous sur le même membre

n°764960
cricri_
Posté le 15-06-2004 à 21:43:03  profilanswer
 

Ah ? ben là ce n'est vraiment pas ce que j'ai pû lire
On aligne pas sur le membre ayant la contrainte d'alignement la plus importante ?

n°764969
Taz
bisounours-codeur
Posté le 15-06-2004 à 21:46:22  profilanswer
 

on aligne comme on peut pour que chaque membre soit bien aligné comme il faut.

n°764978
cricri_
Posté le 15-06-2004 à 21:51:43  profilanswer
 

Ok, mais alors mon message ? ou est le pb d'alignement et comment je peux le résoudre ?

n°764980
Taz
bisounours-codeur
Posté le 15-06-2004 à 21:53:36  profilanswer
 

ben t'arrêtes de dire à ton compilateur de faire des conneries et tu le laisses aligner comme il l'entend :o

n°764982
cricri_
Posté le 15-06-2004 à 21:56:47  profilanswer
 

Bien chef !  :jap:

n°764984
Taz
bisounours-codeur
Posté le 15-06-2004 à 21:59:02  profilanswer
 

déjà tu serais surpris de voir la taille d'un pointeur de fonction membre je crois

n°764987
cricri_
Posté le 15-06-2004 à 22:00:59  profilanswer
 

vi, j'imagine que c'est plus de 4, au moins 8, peut-être plus, à cause de la vtable ?

n°764989
Taz
bisounours-codeur
Posté le 15-06-2004 à 22:03:26  profilanswer
 

oui. cela dit, je ne sais pas s'il existe de scompilateurs qui ont d'autres mécanismes pour la virtualité

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
equivalent classe builder[CSS] plusieur feuilles de styles en fonction d'un choix
Fonction non bloquante sous telnetfonction split
Saisir le nom que l'on veut attribuer à une instance de classe[resolu]Ais je bien passer les arguments par adresse à ma fonction ?
Comment appeler une fonction à l'aide d'un pointeur sur cette fonctionfonction pour connexion serveur + regex
[Websphere] fonction split() de la classe String non implémenté ?[C++] Pointeur de fonction sur membre d'une classe
Plus de sujets relatifs à : pointeur de fonction membre d'une classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR