Search this site
Embedded Files
Mon BBC SDL pas à pas
  • Accueil
  • BBC BASIC
  • BBC OS
  • BBC MODULES
  • RUBRIQUES
  • LIENS
Mon BBC SDL pas à pas
  • Accueil
  • BBC BASIC
  • BBC OS
  • BBC MODULES
  • RUBRIQUES
  • LIENS
  • More
    • Accueil
    • BBC BASIC
    • BBC OS
    • BBC MODULES
    • RUBRIQUES
    • LIENS

⇨ MENU ⇨ BBC BASIC

FN

DESCRIPTION.


L'instruction FN permet de définir une nouvelle fonction personnalisée. 




SYNTAXE.


DEF FNnom

DEF FNnom( )

DEF FNnom( attributa , attributb , ... , attributn )

DEF FNnom( RETURN attributa , RETURN attributb , ... , attributn )




REMARQUES.


nom peut être n'importe quelle combinaison de lettres, à l'exception des mots réservés par le BBC BASIC, majuscules ou minuscule, de chiffres et de caractères de soulignement. nom peut d'ailleurs commencer par un chiffre ou un caractère de soulignement. nom ne doit pas contenir d'espace. 


attribut sont des paramètres, numériques ou alphanumériques, passées par valeur à la fonction personnalisée. C'est-à-dire que la variable ayant fourni sa valeur à la fonction personnalisée, ne sera pas affectée par des modifications qui seraient apportées à attribut dans la fonction personnalisée.


RETURN attribut sont des paramètres, numériques ou alphanumériques, passés par référence à la fonction personnalisée. C'est-à-dire que la variable ayant fourni sa valeur à la fonction personnalisée, sera affectée par les modifications qui seraient apportées à attribut dans la fonction personnalisée.


L'instruction FN doit être est immédiatement : 

- précédée du mot-clé DEF ; 

- suivi du nom de la fonction ; 

- puis d'une paire de parenthèses contenant des paramètres de n'importe quel type, ou pas.


Contrairement aux procédures personnalisées, définies avec l'instruction PROC, qui se termine par l'instruction ENDPROC, la définition d'une fonction ne se clôt pas par une instruction spécifique, mais par un signe égale (=) suivi de la valeur, numérique ou alphanumérique, qui doit être retournée.


Il n'est pas nécessaire de la définir la variable qui recevra la valeur retournée par une fonction personnalisée avant de l'utiliser pour appeler cette fonction personnalisée.


Les valeurs des paramètres réels sont affectées aux paramètres formels dans le même ordre que celles passées lors de l'appel de la fonction personnalisée. Il doit y avoir autant de valeurs passées que de paramètres attendus dans la définition de la fonction personnalisées. Le type de valeur du paramètre doit être compatible avec celui de la valeur passée. Les paramètres formels sont automatiquement définis comme LOCAL dans la fonction personnalisée.

PROC_Voyage( "Quebec" , "Montreal" , 250  , 2.85 )

END


DEF PROC_Voyage( Qdepart$ , Qarrivee$ , Qdistance , Qduree )

PRINT "Notre trajet de " ; Qdepart$ ; " a " ; Qarrivee$

kduree$ = FN_Duree( Qduree )

PRINT "a fait " ; Qdistance ; " Km et a duree " ; kduree$

PRINT "a la moyenne de " ; Qdistance / Qduree ; " Km/h."

END PROC


DEF FN_Duree( Q )

kheures = INT ( Q )

kreste = Q - kheures

kminutes = kreste * 60

= STR$( kheures ) + " h et " + STR$( INT( kminutes ) ) + " minutes"


Note : les valeurs passées lors de l'appel de la fonction sont nommées paramètres réels tandis que les noms de variables présent dans la définition sont nommés paramètres formels. 



Plusieurs fonctions peuvent avoir le même identifiant, nom, mais une seule sera exécutée lors d'un appel de la fonction personnalisée par FNnom, avec cet ordre de priorité : 

- d'abord, dans un même script, c'est la fonction définie en dernier, vers la fin du script, qui sera exécutée ;

- ensuite, les fonctions présentent dans le script sont prioritaires sur celles chargées avec l'instruction INSTALL ;

- enfin, la dernière fonction chargée par une instruction INSTALL sera exécutée.


Une fonction personnalisée n'a pas besoin d'être déclarée avant son utilisation, donc que leurs définitions soient faites en début ou en fin du programme ne présente aucun avantage en termes de vitesse. Cependant, pour une plus grande lisibilité et une meilleure maintenance, il est fortement conseillé de les placer en fin du programme, et surtout après l'instruction END qui termine et arrête le programme.



Une fonction personnalisée est une suite d'instructions qui ne seront exécutées que si la fonction personnalisée est appelée dans le corps principal du programme, depuis une procédure personnalisée ou une autre fonction personnalisée.


Contrairement aux procédures personnalisées définies à l'aide de l'instruction PROC, une fonction personnalisée doit toujours retourner une valeur, du même type que celui de la variable associée à son appel. Le corps de la fonction personnalisée effectuera souvent plusieurs actions avant de produire la valeur finale, mais elle ne retournera toujours qu'une seule valeur.


La définition d'une fonction personnalisée peut se trouver sur une ou plusieurs lignes, selon la complexité des calculs demandés pour obtenir la valeur à retourner.

DEF FN_Perimetre( Qlargeur , Qlongeur ) = 2 * ( Qlargeur + Qlongeur )

équivaut à

DEF FN_Perimetre( Qlargeur , Qlongeur ) 

kdemi = Qlargeur + Qlongeur

= 2 * kdemi



Les fonctions personnalisées sont réentrantes et par défaut la valeur de ses paramètres, s'il y en a, sont passés par valeur. Les variables provenant du corps principal du programme étant de portée globale, elles sont par nature consultables et modifiables dans toutes les procédures et fonctions personnalisées, elles n'ont donc pas à figurer dans la liste des paramètres. Par contre, passer une variable de portée globale par valeur, permet de préserver sa valeur acquise dans le programme au moment de l'appel de la fonction personnalisée.

kduree = 2

kvitesse = 100

kdistance = FN_Distance( kvitesse )

PRINT kduree, kvitesse , kdistance

END


DEF FN_Distance( Qvitesse )

PRINT kduree , Qvitesse , kduree * Qvitesse

kduree = 3

Qvitesse = 44

PRINT kduree , Qvitesse , kduree * Qvitesse

= kduree * Qvitesse


retourne :

2      100     200

3      44       132

3      100     132


La variable kduree, qui n'est pas passée comme paramètre à la fonction personnalisée FN_Distance voit sa valeur modifiée dans la fonction FN_Distance. Cette nouvelle valeur de la variable kduree est bien conservée après l'exécution de la fonction.


La variable kvitesse, qui est passée par valeur, et qui se nomme, à pour alias, Qvitesse dans la définition de la fonction personnalisée FN_Distance voit sa valeur modifiée dans la fonction FN_Distance. Cette nouvelle valeur de la variable kvitesse est perdue après l'exécution de la fonction.


La variable kdistance, qui reçoit la valeur retournée par la fonction FN_Distance, est calculée en fonction des valeurs affectées aux paramètres dans le corps de la fonction personnalisée, et non en tenant compte des valeurs qu'avaient les variables kduree et kvitesse avant l'appel de la fonction.


Note : les valeurs des paramètres peuvent être, si besoin, passée par des valeur brutes. Par exemple : ka = 2 : kb = 4 : kc = FN_Test( ka , kb ) équivaut à kc = FN_Test( 2 , 4 )



L'utilisation de l'instruction RETURN devant un paramètre dans la définition de la fonction personnalisée, permet de passer une variable par référence, et donc de modifier sa valeur dans les corps de cette fonction personnalisée. L'utilisation de l'instruction RETURN dans une définition de fonction personnalisée permettra de modifier une variable déclarée comme LOCAL ou PRIVATE provenant de la procédure ou fonction personnalisée qui a appelée cette fonction personnalisée et de préserver cette modification dans la procédure ou fonction personnalisée appelante.

klargeur = 3

klongueur = 17

PROC_Aire

PRINT "Un rectangle de " ; klargeur ; " par " ; klongueur ; " a  : "

PRINT " - un perimetre de " ;  2 * ( klargeur + klongueur )

PRINT " - une superficie de " ; klargeur * klongueur 

END


DEF PROC_Aire

LOCAL klargeur , klongueur

klongueur = 0

FOR kvaleur = 1 TO 3

klargeur = kvaleur + 4

kperimetre = FN_Calcul( klargeur , klongueur )

PRINT "Un rectangle de " ; klargeur ; " par " ; klongueur ; " a  : "

PRINT " - un perimetre de " ; kperimetre 

PRINT " - une superficie de " ; klargeur * klongueur 

NEXT kvaleur

ENDPROC 


DEF FN_Calcul( Qlargeur , RETURN Qlongueur )

Qlongueur = 2 + Qlongueur + Qlargeur

kperimetre = 2 * ( Qlargeur + Qlongueur )

Qlargeur = Qlargeur - 3

= kperimetre


retourne

Un rectangle de 5 par 7 a  : 

- un perimetre de 24

- une superficie de 35

Un rectangle de 6 par 15 a  : 

- un perimetre de 42

- une superficie de 90

Un rectangle de 7 par 24 a  : 

- un perimetre de 62

- une superficie de 160

Un rectangle de 3 par 17 a  : 

- un perimetre de 40

- une superficie de 51


Dans cet exemple, la variable klongueur, déclarée comme LOCAL dans la procédure personnalisée PROC_Aire, a sa valeur qui est bien celle calculée et retournée par son alias Qlongueur dans la fonction personnalisée FN_Calcul. Tandis que la variable klargeur, déclarée comme LOCAL dans la procédure personnalisée PROC_Aire, ne voit pas sa valeur modifiée par les manipulations effectuées sur son alias Qlargeur. On observera aussi que les variables globales de même nom, klongueur et klargeur, déclarées par leur affectation dans le corps principale n'ont pas été modifié à la sortie de la procédure PROC_Aire



Une fonction personnalisée peut contenir plusieurs inducteurs de retour (=), mais seul le premier rencontré retournera la valeur qui lui est associée avant de quitter la fonction personnalisée, même s'il reste des instructions non exécutées.

FOR kvaleur = 1 TO 7

kretourne$ = FN_Test( kvaleur )

PRINT kretourne$

NEXT kvaleur

END


DEF FN_Test( Q )

IF Q = 1 THEN = STR$( Q ) + " est un premier"

IF Q = 3 THEN = STR$( Q ) + " s'ecrit trois"

IF Q = 2 OR Q = 4 OR Q = 6 THEN = STR$( Q ) + " est pair"

PRINT "Aucun test valide" ;

= STR$( Q )



Si une ou des variables, utilisées dans le corps d'une fonction personnalisée, sont susceptibles d'avoir le même nom qu'une des variables de portée globale, par exemple si la fonction personnalisée a été importée par une instruction INSTALL, mais qu'elles doivent bien être différenciées, afin que la variable principale de portée globale n'ait pas sa valeur modifiée dans la fonction personnalisée, pour le bon fonctionnement de l'application, on utilisera l'instruction : 

- LOCAL, si la valeur de la variable ne doit pas être conservée à la sortie de la fonction personnalisée ; 

- PRIVATE, si la valeur de la variable doit être conservée à la sortie de la fonction personnalisée.

 


Rappel : les tableaux de données et les structures données déclarés comme LOCAL ou PRIVATE dans une fonction personnalisée doivent être (re)dimensionnés dans le corps de cette fonction personnalisée, et bine sûr avant leur utilisation utilisation.


Rappel : dans une fonction personnalisée, les variables qui ne sont ni des paramètres formels ni déclarées comme LOCAL ou PRIVATE doivent être des variables de portées globales, c'est-à-dire qu'elles doivent être consultables et/ou modifiables, dans tour le script du programme, y compris de les procédures et fonctions personnalisées.


Note : si une erreur est retournée lors de l'exécution d'une fonction personnalisée contenant un gestionnaire d'erreur activé avec l'instruction composée ON ERROR LOCAL, l'instruction composée RESTORE LOCAL permettra de restaurer les valeurs des paramètres formels, passées à la fonction lors de son appel, ainsi que celle des variables LOCAL et/ou PRIVATE à leur valeur initiale. RESTORE LOCAL exécutera ensuite les instructions composées RESTORE DATA et RESTORE ERROR. Voir la rubrique sur les gestionnaires erreurs pour plus de détails.



Voir l'instruction LOCAL pour de déclarer des variables de portée locale dans une fonction personnalisée.

Voir l'instruction PRIVATE pour de déclarer des variables privées dans une fonction personnalisée.

Voir l'instruction PROC pour définir une procédure personnalisée.

Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de

vos remarques, vos commentaires et de vos suggestions.

Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour

TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER

avec un exemple de résolution à télécharger pour vous inspirer.

Google Sites
Report abuse
Page details
Page updated
Google Sites
Report abuse