Salut,
Il n'y a pas moyen de forcer quoi que ce soit à se placer à une adresse mémoire précise, pour la simple et bonne raison que l'adresse est peut etre déjà utilisée par autre chose.
Par contre, il est toujours possible de récupérer l'adresse mémoire de n'importe quoi se trouvant en mémoire, et ce, y compris pour l'adresse de début d'une fonction
Il est donc en effet possible de "jouer" avec des pointeurs de fonctions, ce qui est une possibilité régulièrement utilisée pour implémenter un système de "callback".
Le plus facile en C++ consiste en la définition d'un typedef proche de
typedef typederetour (* nomdutypedefSurPointeurDefonction) (/*<listdD'argument> */);
puis de définir une variable de type nomdutypedefSurPointeurDefonction et d'y affecter, bien sur, une fonction dont la signature correspond à celle que l'on a déterminée.
Ainsi, le code suivant
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream>
/* déclare un type nommé "callbackType" comme étant un pointeur
* de fonction ne prenant aucun argument et ne renvoyant rien
*/
typedef void (*callbackType)();
/* une première fonction ne prenant aucun argument et ne renvoyant rien
*/
void hello()
{
std::cout<<"hello ";
}
/* une autre fonction ne prenant aucun argument et ne renvoyant rien
*/
void world()
{
std::cout<<"world"<<std::endl;
}
void callIt(callbackType cb)
{
(*cb)();
}
int main()
{
/* nous aurions pu joindre les deux instructions suivantes, c'est
* juste fait ici pour bien montrer les étapes successives
*/
callbackType cb1 = NULL;
/*affecte l'adresse de la fonction "hello" à notre pointeur de fonction
*/
cb1 = hello;
/*ce qui serait revenu au même que
*/
callbackType cb2 = world;
/* appelle la fonction
*/
callIt(cb1);
callIt(cb2);
return 0;
} |
nous affichera "hello world".
Il existe cependant certaines subtilités dés que l'on souhaite travailler avec des pointeurs de fonctions membres de classes.
Si cela t'intéresse, je m'étendrai volontiers sur le sujet
Partager