Recuperer l'adresse d'une fonction virtuelle pure [modified] [C++] - C++ - Programmation
Marsh Posté le 01-09-2003 à 20:56:54
chrisbk a écrit : vala, j'ai un objet genre : |
Comme ça ?
Code :
|
Marsh Posté le 01-09-2003 à 21:15:58
Kristoph a écrit :
|
en fait g deja plus ou moins un truc du genre et c justement ce double appel que je veux virer
Marsh Posté le 01-09-2003 à 21:25:16
Code :
|
fais un petit tour dans la STL aussi, ça fournit de bon wrapper pour tout ça
edit: il me semble pas que le fais que ça soit virtuel ou pur, ou les deux, change quelque chose
Marsh Posté le 01-09-2003 à 22:41:35
ReplyMarsh Posté le 01-09-2003 à 22:51:26
chrisbk a écrit : |
en fait, je vois ce que tu veux dire.. t'en as besoin pourquoi
Marsh Posté le 01-09-2003 à 22:56:06
Taz a écrit : en fait, je vois ce que tu veux dire.. t'en as besoin pourquoi |
la vérité est que cette fonction n'a pas d'adresse si ce n'est dans la vtable. tout compilateur te jètera à la moindre convertion en quoi que soit. la seul astuce -> le hack C à coup d'union (je sais plus comment on dit genre piggy typing)
Code :
|
Marsh Posté le 01-09-2003 à 22:57:22
putain je sui qu'une grosse burne qui sait pas lire un message d'erreur
je vais me fouetter je reviens
Marsh Posté le 01-09-2003 à 23:02:17
Taz a écrit : en fait, je vois ce que tu veux dire.. t'en as besoin pourquoi |
j'ai fais un compilo () et j'ai un binding ZGSL(le nom grotesque du truc)->C++
Bref
Jusque la j'ai un truc genre :
code ZGSL->appel fonction C++->appel fonction C++ finale
(cf truc Kristoph)
Bref, pour des raisons d'optimisations (oui j'en suis a compter les functions call) je veux supprimer le bout intermediaire
donc, je met le this dans ecx () et tout ce que j'ai a faire c appeler la fonction virtuelle...puor ca j'ai besoin de son adresse. Vala !
Marsh Posté le 01-09-2003 à 23:03:32
Taz a écrit : la vérité est que cette fonction n'a pas d'adresse si ce n'est dans la vtable. tout compilateur te jètera à la moindre convertion en quoi que soit. |
J'etais parti de l'idée que le compilo a moyen de trouver cette adresse (au moins lors de l'appel), donc doit avoir moyen de la mettre dans une chtite variable
Marsh Posté le 01-09-2003 à 23:29:34
Tiens, disassembly du truc :
Code :
|
La derniere ligne est autement interessante !
Si on la suit on arrive sur :
Code :
|
(ecx etant this, [ecx] doit etre la vtable)
et un jmp plus loin...
Code :
|
coucou
Conclusion : forcé le bourrinage du pointeur gentillement refilé par le compilo
Marsh Posté le 01-09-2003 à 23:42:10
Et voila le travail !
Code :
|
Portabilité ? quelle portabilité ?
Marsh Posté le 01-09-2003 à 23:57:13
Taz a écrit : la vérité est que cette fonction n'a pas d'adresse si ce n'est dans la vtable. tout compilateur te jètera à la moindre convertion en quoi que soit. la seul astuce -> le hack C à coup d'union (je sais plus comment on dit genre piggy typing)
|
tres elegant (j'avais skippé un peu vite, honte a moi)
vais la jouer comme ca tiens
Marsh Posté le 02-09-2003 à 00:08:41
chrisbk a écrit : |
on doit pas avoir la meme notion d'elegance
bon en meme temps j'ai rien compris au code
Marsh Posté le 02-09-2003 à 00:51:36
the real moins moins a écrit : on doit pas avoir la meme notion d'elegance |
disons que ce je veux fair est de toute facon a ranger dans la categorie "cochonou", alors la notion d'elegance est toute relative
Marsh Posté le 02-09-2003 à 00:57:55
ReplyMarsh Posté le 02-09-2003 à 09:27:45
ReplyMarsh Posté le 02-09-2003 à 09:35:29
Et une 2° méthode virtuelle qui renvoie l'adresse de celle souhaitée ? Ca serait + portable nan ?
Marsh Posté le 02-09-2003 à 09:36:06
ReplyMarsh Posté le 02-09-2003 à 09:37:25
HelloWorld a écrit : Et une 2° méthode virtuelle qui renvoie l'adresse de celle souhaitée ? Ca serait + portable nan ? |
huh ?
comment elle recupere l'adresse, ta deuxieme fonction virtuelle ?
Nota, la solution de taz a l'air un minimum portable vu que ca marche sur mon VC et je doute fort qu'il ait jamais programmé dessus
Marsh Posté le 02-09-2003 à 09:39:02
chrisbk a écrit : Et bien HCNI sur TCZP |
de toutes façons, il doit bien exister une putain d'implémentation sans vtable alors
Marsh Posté le 02-09-2003 à 09:44:16
(rien cpris a ton TTtruc )
Taz a écrit : |
Marche tres bien ta methode, j'assume pleinement le cote cochonou
Marsh Posté le 02-09-2003 à 09:45:55
ReplyMarsh Posté le 02-09-2003 à 09:55:42
chrisbk a écrit : |
Quand Tigrou (Tigger) en a marre, il dit « ta ta for now » et s'en va en bondissant.
C'était donc de ma part un clin d'oeil pour dire: on arrete de dévier (meme si c'est moi qui est commencé )
Marsh Posté le 02-09-2003 à 10:05:46
Taz a écrit : Quand Tigrou (Tigger) en a marre, il dit « ta ta for now » et s'en va en bondissant. |
ah ok
Bah de toute facon j'ai ma reponse, ca marche (enfin ca marchera quand ce compilo a la con arretera de croire que mon int est un float -ou je sais pas exactement ce qui lui passe par la tete)
Marsh Posté le 02-09-2003 à 10:19:12
La classe qui concrétise une méthode virtuelle pure connaît l'adresse de cette méthode non (contrairement à la classe de base) ?
Marsh Posté le 02-09-2003 à 10:30:47
HelloWorld a écrit : La classe qui concrétise une méthode virtuelle pure connaît l'adresse de cette méthode non (contrairement à la classe de base) ? |
ben oui et non
Code :
|
truc2 de B ne connait pas forcement l'dresse de truc
Marsh Posté le 02-09-2003 à 10:51:34
pour formaliser un peu le Hack, si certains qui passe ici veulent faire mu-muse
Code :
|
edit: l'affichage est pourri mais me convient
Marsh Posté le 02-09-2003 à 11:22:55
Mais si tu désignes tes méthodes ainsi : B::truc, C::truc, ça va pas ?
Code :
|
Marsh Posté le 02-09-2003 à 22:41:08
tiens ouais pas essayé
Anyway les enfants, je sais pas si c'est specifique a visu mais l'appel de fonction virtuelles a la main c'est un bordel sans nom je suis pas sur de tout bien comprendre
Marsh Posté le 02-09-2003 à 22:57:36
c'est quoi une fonction virtuelle pure
Marsh Posté le 02-09-2003 à 22:58:30
the real moins moins a écrit : c'est quoi une fonction virtuelle pure |
en java ca serait une fonction abstract
Marsh Posté le 02-09-2003 à 23:08:46
mais qu'est-ce que tu veux faire avec son adresse alors
Marsh Posté le 02-09-2003 à 23:14:20
the real moins moins a écrit : mais qu'est-ce que tu veux faire avec son adresse alors |
le con
Appeler depuis mon langage a moi (qui est compilé en asm) des fonctions C++. Deshalb j'ai besion de l'adresse de ladite fonction
Marsh Posté le 02-09-2003 à 23:37:56
putain tout monde compilé est foireux a cause d'un push ecx, autrement un malheureux octet
Marsh Posté le 01-09-2003 à 20:44:18
J'offre pomme a celui qui m'explique pourquoi :
POurquoi cet ane baté de visual push ECX !
Bref qui qui a la convention d'appel de fonction virtuelle sous la main ?
Anciennement :
vala, j'ai un objet genre :
suivi de, planqué au fin fond d'une dll :
En surface (dans l'exe), je n'ai donc que des IVertexShader *.
Soit le code suivant :
IVertexShader *r = createVertexShader();
comment recuperer (est ce seulement possible ?) l'adresse de la fonction qui va etre executé quand je ferais
?
Ma magouille habituelle consiste a faire un truc du genre :
typedef void (Toto::*fVSPtr)(void);
et donc dans *lpAddr j'ai l'addresse de la fonction membre souhaité (je vous le concede, la propreté n'est pas au rendez vous)
pb c que la visual rale
Bref, comment faire ?
(vivi j'en ai besoin, je sais ce que je fais)
Message édité par chrisbk le 02-09-2003 à 22:55:51