Function pointers

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

May 23, 2013
508
0
322
'merica
sup

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
Grace au pointeurs sur fonction, il s’exécutera comme ça:
Code:
call [pointeur qui contient l'adresse de la fonction]
Mais on est pas la pour parler d'ASM donc je vais vous montrer comment ça ce passe en C++.


Main
nom de merde, je sais.
Donc vous avez votre IDE ouvert, la fonction main() définie et le header <iostream> importé.
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);
"Eh mais c'est moche et long a écrire ! " - Exactement, c'est pourquoi nous allons utiliser typedef :
PHP:
typedef int (*DoMaths) (int x);
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.)
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 = &Square;

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.
blackhat.gif
 
Last edited:
M

Membre supprimé 358475

Pile poil ce que je cherchais, merci.

Sa serait coul que tu face plus de tuto dans la section c++ ^^