Menu
Coddy logo textTech

Passage de fonctions en arguments

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 36 sur 61.

L’une des utilisations les plus puissantes des pointeurs de fonction consiste à les transmettre comme arguments à d’autres fonctions. Cela vous permet d’injecter un comportement personnalisé dans une fonction sans modifier son code : une technique parfois appelée callback.

Considérez une fonction qui effectue un calcul sur deux nombres. Au lieu de coder l’opération en dur, vous pouvez accepter un pointeur de fonction qui définit l’opération à effectuer :

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

La fonction compute ne sait pas si elle effectue une addition, une soustraction ou quelque chose de complètement différent. Elle appelle simplement la fonction qui lui est transmise :

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // Sortie : 8
    printf("%d\n", compute(5, 3, multiply));  // Sortie : 15
    return 0;
}

Remarquez comment la même fonction compute produit des résultats différents selon la fonction que nous lui transmettons. Ce modèle est fondamental pour écrire du code flexible et réutilisable. Vous écrivez la structure une seule fois, et les utilisateurs de votre fonction fournissent la logique spécifique dont ils ont besoin.

challenge icon

Défi

Facile

Écrivez une fonction apply_twice qui prend deux entiers et un code d’opération, applique l’opération aux nombres deux fois de suite, puis renvoie le résultat final.

Votre fonction recevra un code d’opération qui détermine l’opération à utiliser. Vous devez définir les fonctions d’opération dans votre solution et les transmettre à une fonction auxiliaire compute qui accepte un pointeur de fonction.

Remarque : seules les fonctions sont nécessaires. Les tests appellent directement apply_twice et vérifient sa valeur de retour : ne lisez donc aucune entrée et n’affichez rien.

Structure requise :

  • Définir un typedef appelé Operation pour un pointeur de fonction qui prend deux paramètres int et renvoie un int
  • Définir deux fonctions d’opération : add (renvoie a + b) et multiply (renvoie a * b)
  • Définir une fonction compute qui prend deux entiers et un pointeur de fonction Operation, puis renvoie le résultat de l’appel de l’opération
  • Dans apply_twice, sélectionner l’opération appropriée en fonction du code, puis utiliser compute deux fois : d’abord avec les nombres d’origine, puis avec le résultat et le deuxième nombre à nouveau

Logique :

  1. Sélectionner la fonction d’opération en fonction de op_code (1 = addition, 2 = multiplication)
  2. Appeler compute(a, b, operation) pour obtenir un résultat intermédiaire
  3. Appeler compute(intermediate, b, operation) pour obtenir le résultat final
  4. Renvoyer le résultat final

Paramètres :

  • a (int) : Premier nombre
  • b (int) : Deuxième nombre
  • op_code (int) : Code d’opération (1 pour l’addition, 2 pour la multiplication)

Renvoie : Le résultat après avoir appliqué l’opération deux fois de suite (int)

Exemple : Avec a = 5, b = 3, op_code = 1 (addition) :

  • Premier calcul : 5 + 3 = 8
  • Deuxième calcul : 8 + 3 = 11
  • Renvoyer : 11

Avec a = 2, b = 4, op_code = 2 (multiplication) :

  • Premier calcul : 2 × 4 = 8
  • Deuxième calcul : 8 × 4 = 32
  • Renvoyer : 32

Essayez vous-même

int apply_twice(int a, int b, int op_code) {
    // Écrire le code ici
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur C en ligne