Procedures
DescriptionProcedure[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...]) ... [ProcedureReturn valeur] EndProcedure
Une procédure est une partie du code indépendante du programme principal qui peut avoir des paramètres et ses propres variables. En PureBasic, les procédures sont récursives et peuvent donc s'appeler elles-mêmes. Lors de chaque appel à la procédure, les variables locales sont automatiquement initialisées avec la valeur 0. Pour accéder aux variables du programme principal, ils faut les partager en utilisant les mots clefs Shared ou Global (voir aussi: Protected et Static).
Les paramètres en fin de procédure peuvent avoir une valeur par défaut (une expression constante est requise). Les paramètres ayant une valeur par défaut pourront être omis lors de l'appel de la procédure, la valeur par défaut de chaque paramètre manquant sera utilisée.
Une procédure peut également recevoir en paramètre des listes chaînées, des maps et des tableaux à l'aide des mot-clefs List, Map et Array (Pour les tableaux vous devrez indiquer le nombre de dimensions, voir l'exemple ci-dessous).
Une procédure peut avoir une valeur de retour si nécessaire. Il faut en définir le type après Procedure et utiliser le mot clef ProcedureReturn à tout moment opportun dans la procédure. ProcedureReturn permet de sortir immédiatement d'une procédure, même si l'appel est placé à l'intérieur d'une boucle.
ProcedureReturn ne peut pas être utilisé pour renvoyer un tableau, une liste chaînée ou une map.
Si aucune valeur n'est spécifiée pour ProcedureReturn, la valeur renvoyée sera indéterminée (voir assembleur en ligne pour plus d'information).
Note: Pour renvoyer une chaîne de caractères dans une DLL, voir DLLs. Pour les programmeurs chevronnés, ProcedureC est disponible pour déclarer la procédure en utilisant la convention d'appel 'cdecl' au lieu de 'stdcall'.
Les procédures peuvent également être appelées de manière asynchrone en utilisant les threads.
Exemple
Procedure.l Maximum(nb1.l, nb2.l)
If nb1>nb2
Resultat.l = nb1
Else
Resultat = nb2
EndIf
ProcedureReturn Resultat
EndProcedure
Resultat.l = Maximum(15,30)
Debug Resultat
End
Exemple: Paramètre par défaut
Procedure a(a, b, c=2)
Debug c
EndProcedure
a(10, 12) ; ou
a(10, 12, 15)
Exemple: Listes chaînées en paramètre
NewList Test.Point()
AddElement(Test())
Test()\x = 1
AddElement(Test())
Test()\x = 2
Procedure DebugList(c.l, List ParametreListe.Point())
AddElement(ParametreListe())
ParametreListe()\x = 3
ForEach ParametreListe()
MessageRequester("Liste", Str(ParametreListe()\x))
Next
EndProcedure
DebugList(10, Test())
Exemple: Tableau en paramètre
Dim Tableau.Point(10, 15)
Tableau(0,0)\x = 1
Tableau(1,0)\x = 2
Procedure TestIt(c.l, Array ParametreTableau.Point(2)) ; Le tableau comporte 2 dimensions
ParametreTableau(1, 2)\x = 3
ParametreTableau(2, 2)\x = 4
EndProcedure
TestIt(10, Tableau())
MessageRequester("Tableau", Str(Tableau(1, 2)\x))
DescriptionDeclare[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...])
Dans certains cas une procédure peut appeler une autre procédure qui n'a pas été déclarée avant sa propre définition. Ce cas peut se produire et provoquer une erreur de compilation 'Procedure not found'. Declare permet de traiter ce cas particulier en déclarant seulement l'en-tête de la procédure. Il est essentiel que les attributs de la fonction Declare et la déclaration réelle de la procédure soient identiques.
Pour les programmeurs chevronnés, DeclareC est disponible pour déclarer la procédure en utilisant la convention d'appel 'cdecl' au lieu de 'stdcall'.
Exemple
Declare Maximum(Valeur1, Valeur2)
Procedure Traitement(Valeur)
Maximum(10, 2) ; A cet instant Maximum() n'est pas connu du compilateur.
EndProcedure
Procedure.l Maximum(Valeur1.l, Valeur2.l)
If Valeur1>Valeur2
Resultat.l = Valeur1
Else
Resultat = Valeur2
EndIf
ProcedureReturn Resultat
EndProcedure