Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

RSS >  Les pointeurs de fonctions, Ou comment faire de la POO en C
a30barrett40 #1 25/04/2007 - 14h09

Codeur entrainé
Groupe : Codeur entrainé
Messages : 107
Enregistré le : 05/03/2007

Hors ligne

Nous allons aller dans le vif du sujet directement.
En 1er, comment déclarer un pointeur de fonction.
Quel type allons nous utiliser ??
Bingo ! le type void* !
Donc on obtient :
void *p = NULL;

Il y a un problème : c'est quoi l'adresse de la fonction?
En fait, l'adresse d'une fonction est la première instruction qu'elle contient, vachement utile!
On va donc tester comme avec un pointeur normal, c'est-à-dire:
p = &fonction;

Mais cela ne marche pas... : n o o o :
On va faire des tests avec une fonction simple :
void fonction()
{
    printf("ca marche !\n);
    getchar();
}

En premier, indiquons que le pointeur est un pointeur de fonction :
void (*p)();


Pourquoi toutes ces paranthèses ?
Voilà la réponse :

* est un opérande utilisé en préfixe et il a une priorité plus faible que () ; c'est pourquoi les parenthèses sont nécessaire pour forcer l'association correcte.


Donc cela perrmet de passer * en priorité (comme en maths, 2+3*2 est différent de (2+3)*2 !)
On peut donc recompiler!

Prenons une autre fonction :
int fonction2(int a, int b)
{
    return a += b;
}

Les secondes parenthèses dans la déclaration du pointeur deviennent utiles, car quel que soit la fonction, un pointeur de fontion ne peut contenir que les fonction qui ont les mêmes types des paramètres.
En gros :
void (*p)();
p = &fonction2;

est faux, il faut mettre int, int entre les secondes parenthèses.

Avant de s'en servir, une petite chose :

Un nom de fonction est automatiquement converti en pointeur sur cette fonction, il n'y a pas besoin du & mais c'est permis et il n'y a pas vraiment de différence.


Donc on peut mettre
p = fonction2 ;
.
La vie c'est comme Windows : y a toujours un problème qu'on a pas prévu...
a30barrett40 #2 25/04/2007 - 14h15

Codeur entrainé
Groupe : Codeur entrainé
Messages : 107
Enregistré le : 05/03/2007

Hors ligne

La suite :
Appeler une fonction par son pointeur :
C'est simple, il faut mettre exactement ce que l'on a mis pour la déclaration du pointeur, sauf que l'on remplace les types par les variables qu'il faut utiliser.

On peut mettre maintenant une fonction en paramètre d'une autre, comme si on l'appelait.

On peut même faire un tableau de pointeurs de fonctions, tel que :
void (*t[2])() = {p,p2};


Et même, on peut mettre un pointeur de fonction dans une structure, ce qui permet de faire de la POO
La vie c'est comme Windows : y a toujours un problème qu'on a pas prévu...

 >  Réponse rapide

Composez votre message

 >  Informations du forum

1 personne(s) présente(s) durant une période de 10 minutes (0 membre(s) et 1 invité(s)).