Jump to content
Sign in to follow this  
AlexMog

[Cours #7] Les pointeurs sur fonction

Recommended Posts

Bonjour à tous,
Ce cours va être très court (oh ce jeu de mot!). En effet, je vais juste vous montrer comment faire un pointeur sur fonction.

 

I- Pointeur sur fonction? Kesako?
Un pointeur sur fonction, c'est simplement une manière d'appeler une fonction, en passant par un pointeur.
Par exemple:

void (*function_pointer)(char);
function_pointer = &my_putchar; // Vous pouvez retrouver la fonction my_putchar sur
le cours #1.
function_pointer('A');

Le programme ci-dessus crée le pointeur sur fonction function_pointer, et lui définit l'adresse de my_putchar (qui permet d'afficher un caractère).
Il affiche 'A'.

II- Utilité?
Un pointeur sur fonction permet d'appeler une fonction via un pointeur. Il est très souvent utilisé pour les tableaux de pointeurs sur fonction. Ce qui permet, par exemple, d'appeler une fonction en fonction d'une condition, sans avoir 40 000 if/else.
Exemple de tableau de pointeurs sur fonction:

#include <unistd.h>
void my_putchar(char c)
{
  write(1, &c, 1);
}

void my_putstr(char *str)
{
  while(*str)
    my_putchar(*(str++));
}

void aff_help()
{
  my_putstr("Commandes:\ncoucou: affiche salut\ndada: affiche dadi\npopo affiche caca");
}

void aff_coucou()
{
  my_putstr("salut\n");
}
void aff_dada()
{
  my_putstr("dadi\n");
}

void aff_popo()
{
 my_putstr("caca\n");
}

void do_cmd(char *cmd)
{
  void (*fptr[])() = {&aff_popo, &aff_dada, &aff_coucou};
  char cmds[] = {"popo", "dada", "coucou"};
  int i = -1;
  
  while (++i < 3)
  {
    if (!strcmp(cmds[i], cmd))
    {
      fptr(i)();
      return ;
    }
  }
  my_putstr("Commande introuvable.");
}

int main(int ac, char **av)
{
  int readed;

  char buffer[4096];
  my_putstr("Entrez votre commande. Utilisez CTRL+D pour quitter\n");
  while ((readed = read(0, buffer, 4095)) != -1)
  {
    buffer[readed] = '\0';
    do_cmd(buffer);
  }
  return (0);
}

III- Déclaration et appel.
Enfin, voyons comment déclarer un pointeur sur fonction, puis comment lui définir une fonction.
Déclarons notre pointeur. Forme de déclaration:

typage_renvoyé_par_la_fonction (*nom_pointeur)(arguments_pris_par_la_fonction);

Par exemple, pour printf:

int (*myptr)(char *, ...); // oui, les ... sont un type. Il existe une fonction qui permet de récupérer une infinité d'args dans une fonction, mais je vousl’expliquerais dans un prochain cours!
// Assignation
myptr = &printf;
// Utilisation
myptr("Salut tout le %s", "monde!\n");

Voilà.
Vous l'aurez compris, les pointeurs sur fonctions sont très, TRES utilisés dans le monde du développement. Il est donc important de savoir les utiliser, pour apprendre à gagner des lignes.
Je vous dis a bientôt pour un prochain cours!
Cours écrit par AlexMog. Contact: alexmog [at] live [point] fr

  • Upvote 3

Share this post


Link to post
Share on other sites

Bon guide, et merci pour l'exemple. :)
+1 rep évidemment et comme toujours.

Tu pourrais donner des exemples concrets d'application dans lesquelles l'utilisation des pointeurs est impératif ?

Share this post


Link to post
Share on other sites

Bon guide, et merci pour l'exemple. :)

+1 rep évidemment et comme toujours.

Tu pourrais donner des exemples concrets d'application dans lesquelles l'utilisation des pointeurs est impératif ?

 

Toutes les applications qui nécessitent de vérifier des chaines (par exemple, un lexeur parseur ;)). Pour exemple, j'en utilise une au niveau du serveur du Melichat.  Ça simplifie pas mal le code.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...