PROC
DESCRIPTION.
L'instruction PROC permet de définir une nouvelle procédure personnalisée, elle doit être précédée d'une instruction DEF.
L'instruction ENDPROC termine la définition d'une procédure personnalisée, elle est obligatoire.
SYNTAXE.
DEF PROCnom
...
ENDPROC
DEF PROCnom( )
...
ENDPROC
DEF PROCnom( attributa , attributb , ... , attributn )
...
ENDPROC
DEF PROCnom( RETURN attributa , RETURN attributb , ... , attributn )
...
ENDPROC
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 procédure 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 procédure 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 PROC 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 fonctions personnalisées, définies avec l'instruction FN, qui se terminent par un signe égale (=) suivi de la valeur à retourner, la définition d'une procédure ne se clôt pas par l'instruction ENDPROC.
L'instruction ENDPROC provoque le retour de l'exécution du programme à la l'instruction suivant l'appel de la procédure personnalisée appelante, après avoir restaurée l'état des variables déclarées comme LOCAL ou PRIVATE dans la définition, ainsi que les arguments factices.
Si la procédure personnalisée n'attend pas de paramétre pour son bon fonctionneent, la paire de paranthèses est facultative. Mais si une paire de parenthèses est présente à la suite du nom de la procédure personnalisée, elle devra être aussi présente lors de l'appel de cette procédure 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 procédure personnalisée. Il doit y avoir autant de valeurs passées que de paramètres attendus dans la définition de la procédure 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."
ENDPROC
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 procédure 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 procédure peuvent avoir le même identifiant, nom, mais une seule sera exécutée lors d'un appel de la procédure personnalisée par PROCnom, avec cet ordre de priorité :
- d'abord, dans un même script, c'est la procédure définie en dernier, vers la fin du script, qui sera exécutée ;
- ensuite, les procédures présentent dans le script sont prioritaires sur celles chargées avec l'instruction INSTALL ;
- enfin, la dernière procédure chargée par une instruction INSTALL sera exécutée.
Une procédure 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 procédure personnalisée est une suite d'instructions qui ne seront exécutées que si la procédure personnalisée est appelée dans le corps principal du programme, depuis une fonction personnalisée ou une autre procédure personnalisée.
Contrairement aux fonction personnalisées définies à l'aide de l'instruction FN qui doit toujours retourner une valeur, du même type que celui de la variable associée à son appel, une procédure personnalisée ne retourne rien et ne doit donc pas âtre associée à une variable lors de son appel.
La définition d'une procédure personnalisée peut se trouver sur une ou plusieurs lignes, selon la complexité des actions a exécuter pour obtenir la valeur à retourner.
DEF PROC_Perimetre( Qlargeur , Qlongeur ) : PRINT "Perimetre = " ; 2 * ( Qlargeur + Qlongeur ) : ENDPROC
équivaut à
DEF PROC_Perimetre( Qlargeur , Qlongeur )
PRINT "Perimetre = " ; 2 * ( Qlargeur + Qlongeur )
ENDPROC
Les procédures 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 = 0
PROC_Distance( kvitesse )
PRINT kduree, kvitesse , kdistance
END
DEF PROC_Distance( Qvitesse )
PRINT kduree , Qvitesse , kduree * Qvitesse
kduree = 3
Qvitesse = 44
kdistance = kduree * Qvitesse
PRINT kduree , Qvitesse , kdistance
ENDPROC
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 PROC_Distance voit sa valeur modifiée dans la fonction PROC_Distance. Cette nouvelle valeur de la variable kduree est bien conservée après l'exécution de la procédure.
La variable kvitesse, qui est passée par valeur, et qui se nomme, à pour alias, Qvitesse dans la définition de la procédure personnalisée PROC_Distance voit sa valeur modifiée dans la fonction PROC_Distance. Cette nouvelle valeur de la variable kvitesse est perdue après l'exécution 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 : PROC_Test( ka , kb ) équivaut à PROC_Test( 2 , 4 )
L'utilisation de l'instruction RETURN devant un paramètre dans la définition de la procédure personnalisée, permet de passer une variable par référence, et donc de modifier sa valeur dans les corps de cette procédure personnalisée. L'utilisation de l'instruction RETURN dans une définition de procédure 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 procédure 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
Si une ou des variables, utilisées dans le corps d'une procédure personnalisée, sont susceptibles d'avoir le même nom qu'une des variables de portée globale, par exemple si la procédure 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 procédure 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 procédure personnalisée doivent être (re)dimensionnés dans le corps de cette procédure personnalisée, et bien sûr avant leur utilisation utilisation.
Rappel : dans une procédure 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 FN pour définir une fonction personnalisée.
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.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
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.