Procedures


Syntax
Procedure[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>]>, ...]) 
  ...
  [ProcedureReturn valeur]
EndProcedure 
Description
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: procédure qui renvoie une valeur numérique

  Procedure Maximum(nb1, nb2)
    If nb1>nb2
      Resultat = nb1
    Else
      Resultat = nb2
    EndIf
  
    ProcedureReturn Resultat
  EndProcedure 
  
  Resultat = 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))

Syntax
Declare[.<type>] nom(<variable1[.<type>]> [, <variable2[.<type>] [= ValeurParDefaut]>, ...])
Description
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 (type et ValeurParDefaut compris).

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