sup
Petit tutoriel sur les function pointers ("pointeur sur fonction" en fr je crois).
Ils pourront donc nous servir d’intermédiaire.
L'appel de la fonction s’exécute normalement comme ça:
Grace au pointeurs sur fonction, il s’exécutera comme ça:
Mais on est pas la pour parler d'ASM donc je vais vous montrer comment ça ce passe en C++.
Définition d'un pointeur sur une fonction de type int qui prend un argument:
"Eh mais c'est moche et long a écrire ! " - Exactement, c'est pourquoi nous allons utiliser typedef :
Le type DoMaths est donc un pointeur sur une fonction de type int qui prend un argument (x).
Maintenant, nous allons déclarer quelques fonctions pour tester notre pointeur: (je ne prend pas la peine d'expliquer ces fonctions, si vous ne comprenez pas, ce tutoriel n'est pas pour vous.)
Dans notre fonction main, on va donc déclarer une variable de type DoMaths (AKA int (*) (int x) ) :
Pour appeler la fonction contenue dans notre pointeur "test", nous avons aussi deux options:
Soooooooooooooooo, yeah. Y'a pas énormément de choses a dire sur ces pointeurs, une fois que vous avez compris le fonctionnement, c'est super simple.
Ces pointeurs peuvent aussi être utiliser pour appeler des fonctions d'un module, en utilisant typedef et GetProcAdress/GetModuleHandle.
Questions, critiques, etc sont toujours les bienvenues.
Petit tutoriel sur les function pointers ("pointeur sur fonction" en fr je crois).
Prérequis
- Un IDE
- Les bases du C++ (pointeurs, fonctions, variables etc.)
Qu'est ce que c'est ?
Tout simplement des pointeurs, mais au lieu de pointer vers des variables, ils pointent vers des fonctions.Ils pourront donc nous servir d’intermédiaire.
L'appel de la fonction s’exécute normalement comme ça:
Code:
call adresse de la fonction
Code:
call [pointeur qui contient l'adresse de la fonction]
Main
nom de merde, je sais.
Donc vous avez votre IDE ouvert, la fonction main() définie et le header <iostream> importé.nom de merde, je sais.
PHP:
#include <iostream>
int main(int nArgs, char* pArgs[])
{
std::cin.sync();
std::cin.get();
return 0; // ou EXIT_SUCCESS
}
Définition d'un pointeur sur une fonction de type int qui prend un argument:
PHP:
int (*YOLO) (int x);
PHP:
typedef int (*DoMaths) (int x);
Maintenant, nous allons déclarer quelques fonctions pour tester notre pointeur: (je ne prend pas la peine d'expliquer ces fonctions, si vous ne comprenez pas, ce tutoriel n'est pas pour vous.)
PHP:
int Square(int x) { return x*x; }
int Sub(int x) { return --x; } // NB: Utilisez bien --x et ++x , x-- et x++ retourneraient quelque chose de différent.
int Add(int x) { return ++x; }
Dans notre fonction main, on va donc déclarer une variable de type DoMaths (AKA int (*) (int x) ) :
PHP:
DoMaths test = Square;
//ou
DoMaths test = □
Pour appeler la fonction contenue dans notre pointeur "test", nous avons aussi deux options:
PHP:
std::cout << (*test) (3) << std::endl; /*Ici on déréférence le pointeur, puis on appelle la fonction qu'il contient avec le paramètre 3 */ << std::endl;
// Puis on l'affiche
-----------------------------------------
std::cout << test(3) << std::endl;
//Exactement la même chose, juste plus simple a écrire.
Conclusion
Soooooooooooooooo, yeah. Y'a pas énormément de choses a dire sur ces pointeurs, une fois que vous avez compris le fonctionnement, c'est super simple.
Ces pointeurs peuvent aussi être utiliser pour appeler des fonctions d'un module, en utilisant typedef et GetProcAdress/GetModuleHandle.
Questions, critiques, etc sont toujours les bienvenues.
Cordialement, Davy.
Last edited: