|
|
Chapitre 17 — Fonctions définies par l'Utilisateur : FN
Vous serez heureux d'apprendre que toutes les informations concernant les
PROC
contenues dans le chapitre précédent s'appliquent aussi aux fonctions définies par l'utilisateur -
FN.
La seule différence, c'est qu'une
FN
renvoie une valeur à la ligne où elle est appelée, et que, par conséquent, de la même façon que
les fonctions intrinsèques comme
SQR,
elle peut être utilisée à l'intérieur d'expressions.
REM Carré d'un nombre en utilisant FN
A=4
B=FN_Carre(4)
PRINT A;" au carré égale ";B
END
DEF FN_Carre(Nombre)
=Nombre^2
Regardons d'abord la définition. Comme on le voit, nous disons au
BASIC
que nous déclarons une fonction en nous servant de
FN
au lieu de
PROC.
Il n'existe pas de ENDFN. La fin de la fonction est indiquée par la ligne qui commence par
« = ». L'expression est calculée et cette valeur est renvoyée à la ligne qui l'a appelée,
dans notre cas la ligne 3.
Dans certaines autres formes de
BASIC,
il est nécessaire d'inclure dans le nom de la fonction le type de la variable en retour, comme lorsqu'on déclare
une variable.
BBC BASIC
vous permet de faire cela, mais il n'effectue pas de contrôle sur le type de variable en retour pour
le comparer au type spécifié dans le nom. D'habitude, on ne s'en préoccupe pas.
Comme pour les
PROC,
les
FN
peuvent être aussi longues et complexes que vous souhaitez les faire. Elles peuvent appeler d'autres
PROC
et d'autres
FN.
La seule règle que je suggère fortement et à laquelle vous devez vous tenir, c'est que, dans les deux
types de routines, il n'existe qu'un seul et unique point de sortie. Le fait de mettre plusieurs
lignes commençant par le signe « = », en fonction des conditions, semble bien être
une bonne idée, mais cela conduit inévitablement à des ennuis. Il est beaucoup plus propre d'utiliser
une variable locale pour contenir le résultat et puis, à la fin, de renvoyer ceci :
REM Test de voyelles
INPUT "Entrez une lettre : " Car$
IF FN_EstUneVoyelle(Car$) THEN
PRINT Car$;" est une voyelle vraie"
ELSE
PRINT Car$;" n'est pas une voyelle vraie"
ENDIF
END
DEF FN_EstUneVoyelle(Ch$)
LOCAL Resultat%
IF INSTR("AEIOUaeiou", LEFT$(Ch$,1)) THEN
Resultat%=TRUE
ELSE
Resultat%=FALSE
ENDIF
=Resultat%
plutôt que d'écrire ce qui suit, où, si davantage de code vient à être ajouté, chacun des deux points
de retour peut se perdre à l'intérieur du code :
REM ...
DEF FN_EstUneVoyelle(Ch$)
IF INSTR("AEIOUaeiou", LEFT$(Ch$,1)) THEN
=TRUE
ELSE
=FALSE
ENDIF
On ne peut passer en retour que des valeurs uniques, et non des tableaux ou des structures.
(Il existe une méthode pour faire cela, mais cela concerne plutôt le domaine du niveau supérieur.)
Si vous avez besoin d'une valeur en retour, il vaut mieux passer l'ensemble comme paramètre et le manipuler
dans la fonction.
Un truc : À La recherche d'une routine
|
À part dans les programmes les plus ordinaires, vous vous trouverez devant plusieurs
PROC
et plusieurs
FN.
Pour localiser la définition de la routine que vous essayez de retrouver, faites un clic droit
n'importe où dans l'éditeur et, comme par magie, toutes les
PROC
et toutes les
FN
contenues dans le programme ouvert à ce moment-là se trouvent listées au bas du menu qui apparaît.
Pour aller vers l'une d'elles, pointez avec la souris et cliquez.
|
Un truc : Des routines aux noms identiques
|
Il devrait apparaître très évident que vous ne pouvez avoir deux
PROC
ou deux
FN
ayant le même nom, et malgré ce,
« BB4W »
ne se plaindra pas si c'est le cas. Si le
BASIC
trouve deux routines portant le même nom, il se servira de la dernière et ignorera toutes les autres.
Avec un petit programme, cela est facile à repérer. Lorsque les programmes dépassent une page, il devient
difficile de le détecter, et si vous vous servez de bibliothèques, qui vous permettent de répartir
votre code dans plusieurs fichiers, cela vous garantit le mal de tête du siècle. Si le code que vous
modifiez semble n'avoir aucun effet, cherchez des noms en doublons.
|
C'est tout pour ce sujet. Comme on l'a dit, tout ce qui concerne
LOCAL,
PRIVATE,
le scope d'une variable, etc., est exactement la même chose que pour les
PROC.
Exercices
17.1
Il est une fonction très utile pour l'utilisateur : celle qui attend qu'on appuie sur
« o » (pour oui) ou
« n » (pour non)
en réponse à un curseur d'attente, et qui renvoie soit
TRUE
soit
FALSE.
Écrivez-la. Il faudra, bien sûr, vérifier les capitales et les minuscules.
17.2
Écrivez une fonction FN_Minusc qui accepte une chaîne. Elle passera par chaque caractère
de la chaîne pour convertir toutes les capitales en minuscules. Les autres caractères restent inchangés.
Affichez la chaîne convertie.
Fin du Chapitre 17
|