Les procédures et fonctions en C
En informatique, une fonction est une entité qui encapsule une séquence d’instructions effectuant un traitement spécifique indépendant du reste du programme. Cette fonction peut être réutilisée dans le même programme, ou dans un autre. Il faut voir une fonction comme un outil, et la bibliothèque comme la boite à outils. Il est commun que les développeurs réutilisent pendant toutes leurs carrières les outils conçus par eux-mêmes ou d’autres développeurs.
Les fonctions permettent de diviser un problème en décomposant le programme à réaliser en portions de code plus faciles à utiliser et à entretenir. Les instructions dans la fonction sont encapsulées à l’intérieur de celle-ci, c’est-à-dire que la fonction devient une boite noire. Le programmeur peut faire appel à la fonction sans se préoccuper des détails internes à celle-ci. Par exemple, le pseudo code suivant renvoi la valeur maximum des deux variables.
int max(int a, int b) { if( a > b ) return a; return b; }
Maintenant que cette fonction existe, il est possible de l’utiliser, comme s’il s’agissait d’instruction standard, ce qui simplifie nos algorithmes. La fonction doit être, soit déclarée dans le même fichier :
#include <stdio.h> // déclaration de la fonction maximum: int max(int a, int b); // début de l'algorithme int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = max(a, b); printf("La valeur maximale est: %d\n", c); return 0; } // implémentation de la fonction maximum: int max(int a, int b) { if( a > b ) return a; return b; }
Soit, il est possible d’importer cette-dernière depuis un autre fichier. Séparer vos fonctions de vos algorithmes, permets de réduire le couplage des programmes. C’est-à-dire que les fonctions que vous écrivez aujourd’hui, pourraient être réutilisée plus tard dans votre carrière.
# Ce fichier s'appelle: mesFonctions.h int max(int a, int b) { if( a > b ) return a; return b; }
#include "mesFonctions.h" int main(void) { int a, b, c; scanf("%d %d", &a, &b); c = max(a, b); printf("La valeur maximale est: %d\n", c); return 0; }
Le passage par copie ou par référence
Dans les langages de programmation, une copie des variables provenant de la fonction est reçue dans les paramètres au lieu de travailler sur les véritables variables de la fonction appelante. Ce choix est fait pour des raisons de sécurité pour l’intégrité des données. Pour tous les types simples, en C il s’agira toujours d’une copie des variables ; et pour tous les types complexes, il s’agira de référence.

Ceci dit, en C, vous avez la liberté de choisir précisément si vous préférez l’un ou l’autre. Par contre, cette décision rend la syntaxe beaucoup plus lourde et donc augmente le risque d’erreur. Par exemple, la fonction SWAP
peut être implémentée comme ci-dessous. Notez le symbole &a
qui permet le passage par référence. C’est ce même symbole qui est utilisé dans la fonction “scanf” pour exactement les mêmes raisons. Vous noterez également le symbole à côté du type int*
. Ce symbole impose également qu’à l’intérieur de la fonction, toutes les variables devrons être appelée avec ce symbole.
PROCÉDURE swap(↕a: ENTIER, ↕b: ENTIER) VARIABLE c: ENTIER c <- a a <- b b <- c FIN PROCÉDURE DEBUT VARIABLE a, b: ENTIER a <- 7 b <- 42 swap(a, b) ECRIRE a FIN
void swap(int* a, int* b) { int tmp; tmp = *a; *b = *a; *a = tmp; } int main() { int a, b; a = 7; b = 42; swap(&a, &b); printf("%d", a); }