Function pointers

  • Partenaires

Utilisateurs qui regardent le poste (Total: 0, Members: 0, Invité: 0)

davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 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
 
Dernière édition:
Astropilot

Astropilot

The Lord
V.I.P
Level 5
Level 4
Level 3
Level 2
Level 1
6 Janv. 2011
9,277
18
1,254
France
Merci du tutoriel, facile a comprendre, clair et instructif :)
 
M

Membre supprimé 358475

Pile poil ce que je cherchais, merci.

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

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Si tu veut un truc spécifique, demande en MP ;)

(je vient de remarquer ce message, sorry)