Variables locales et globales
Une variable n'existe pas forcément partout dans le programme. L'endroit où elle est utilisable s'appelle sa portée. Bien la comprendre évite des erreurs très difficiles à trouver.
Les variables locales
Une variable déclarée dans une fonction est locale : elle naît quand la fonction commence et disparaît quand elle se termine.
fonction doubler(n)
resultat est un nombre vaut n * 2
retourne resultat
fin fonction
affiche doubler(4) // 8
Après l'appel, resultat n'existe plus. Écrire affiche resultat à la fin de ce programme provoquerait l'erreur « Variable inconnue ». Le seul moyen de faire sortir une valeur d'une fonction, c'est retourne.
C'est une protection : une fonction peut utiliser ses propres variables de travail sans déranger le reste du programme.
Les variables globales
Une variable déclarée dans le programme principal, en dehors de toute fonction, est globale. Les fonctions et les procédures peuvent la lire :
TVA est une constante vaut 20
fonction prixTTC(prixHT)
retourne prixHT * (1 + TVA / 100)
fin fonction
affiche prixTTC(50) // 60
Pour une constante, c'est très pratique : la valeur est définie une fois, et toutes les fonctions y ont accès.
Question : Une variable total est déclarée dans une fonction. Peut-on l'afficher depuis le programme principal après l'appel ? — Non, elle n'existe plus. Une variable locale disparaît à la fin de la fonction. Pour récupérer sa valeur, la fonction doit la renvoyer avec retourne.
Modifier une variable globale : attention
Une procédure peut aussi modifier une variable globale :
score est un nombre vaut 0
procédure marquer(points)
score ajoute points
fin procédure
appelle marquer(10)
appelle marquer(5)
affiche score // 15
Ça fonctionne, et c'est parfois commode (un score, une toile de dessin). Mais c'est aussi un piège : en lisant appelle marquer(10), rien n'indique que score va changer. Dans un grand programme, si dix procédures modifient la même variable, on ne sait plus qui a fait quoi.
La version plus sûre
On préfère une fonction qui reçoit ses données en paramètres et renvoie son résultat :
fonction ajouterPoints(scoreActuel, points)
retourne scoreActuel + points
fin fonction
score est un nombre vaut 0
score vaut ajouterPoints(score, 10)
score vaut ajouterPoints(score, 5)
affiche score // 15
Cette fois, la ligne score vaut ajouterPoints(score, 10) dit clairement que score est modifié. Et la fonction ne dépend de rien d'autre que de ses paramètres : on peut la tester toute seule.
L'outil Audit du programme de CoddyRun v4.3 signale les fonctions qui modifient une variable du programme principal.
Les paramètres sont des copies... sauf les tableaux
Quand on passe un nombre ou un texte à une fonction, elle en reçoit une copie : la modifier ne change pas la variable d'origine.
procédure vieillir(age)
age ajoute 1
affiche 'Dans la procédure : ' + age
fin procédure
anneesLea est un nombre vaut 11
appelle vieillir(anneesLea)
affiche 'Après l’appel : ' + anneesLea // toujours 11
Avec un tableau, c'est différent : la procédure travaille sur le tableau d'origine.
procédure ajouterBonus(liste)
liste ajoute 100
fin procédure
points est un tableau vaut [10, 20]
appelle ajouterBonus(points)
affiche joindre(points, ', ') // 10, 20, 100
C'est ce qui permet à une procédure de tri de ranger le tableau qu'on lui confie.
Les bons réflexes
- Déclare dans la fonction toutes ses variables de travail.
- Donne à la fonction ses données par ses paramètres.
- Fais sortir le résultat avec
retourne. - Réserve les variables globales aux constantes et à quelques données centrales du programme.
En résumé
- Variable locale : déclarée dans une fonction, elle disparaît à la fin de l'appel.
- Variable globale : déclarée dans le programme principal, visible partout.
- Modifier une globale depuis une fonction est possible, mais rend le programme difficile à suivre.
- Un nombre ou un texte passé en paramètre est une copie ; un tableau est partagé.