Prozeduren
BeschreibungProcedure[.<Typ>] Name(<Parameter1[.<Typ>]> [, <Parameter2[.<Typ>] [= StandardWert]>, ...]) ... [ProcedureReturn Wert] EndProcedure
Eine Procedure ist ein Programmteil, welcher unabhängig vom Hauptcode des Programms ist und seine eigenen Parameter und Variablen haben kann. In PureBasic wird bei Prozeduren die Rekursion voll unterstützt, jede Prozedur kann sich auch selbst aufrufen. Die Variablen innerhalb der Prozedur erhalten bei jedem Aufruf der Prozedur standardmäßig den Wert 0 (null). Um auf Variablen des Hauptprogramms zugreifen zu können, müssen diese mit der Prozedur "geteilt" (shared) werden. Dies ist mit den Shared oder Global Schlüsselworten möglich (siehe auch die Protected und Static Schlüsselwörter).
Die letzten Parameter können einen Standardwert (muss ein konstanter Ausdruck sein) haben. Wenn also diese Parameter beim Prozedur-Aufruf weggelassen werden, wird der Standardwert verwendet.
Arrays können mit Hilfe des Schlüsselworts Array als Parameter übergeben werden, verknüpfte Listen mittels des Schlüsselworts List und Maps mittels Schlüsselworts Map.
Eine Prozedur kann wenn nötig eine Zahl oder einen String zurückliefern. Sie müssen in diesem Fall nach Procedure den Typ (.Typ) festlegen und das ProcedureReturn Schlüsselwort an einem beliebigen Punkt innerhalb der Prozedur aufrufen. Ein Aufruf von ProcedureReturn verlässt umgehend die Prozedur, auch wenn er innerhalb einer Schleife erfolgt.
ProcedureReturn kann nicht verwendet werden, um ein Array, eine Linked List oder eine Map zurückzuliefern, übergeben Sie zu diesem Zweck das Array, die Linked List bzw. die Map als Parameter an die Prozedur.
Wenn für ProcedureReturn kein (Rückgabe-) Wert angegeben wird, dann wird der zurückgegebene Wert undefiniert sein (siehe Inline-ASM für weitere Informationen).
Hinweis: Für die Rückgabe von Strings aus DLLs siehe DLLs. Für fortgeschrittene Programmierer ist ProcedureC verfügbar und wird die Prozedur mittels der 'CDecl' anstelle der 'StandardCall' Aufruf-Konvention deklarieren.
Einzelne Prozeduren können durch die Nutzung von Threads auch asynchron zum eigentlichen Hauptprogramm ausgeführt werden.
Beispiel: Prozedur mit einer numerischen Variable als Rückgabewert
Procedure Maximum(nb1, nb2) If nb1 > nb2 Result = nb1 Else Result = nb2 EndIf ProcedureReturn Result EndProcedure Result = Maximum(15, 30) Debug Result
Beispiel: Prozedur mit einem String als Rückgabewert
Procedure.s Attach(string1$,string2$) result$ = string1$+" "+string2$ ProcedureReturn result$ EndProcedure a$ = Attach("PureBasic","Coder") Debug a$
Beispiel: Parameter mit Standardwert
Procedure a(a, b, c=2) Debug c EndProcedure a(10, 12) ; 2 wird als Standardwert für den dritten Parameter genutzt a(10, 12, 15)
Beispiel: Verknüpfte Listen als Parameter
NewList Test.Point() AddElement(Test()) Test()\x = 1 AddElement(Test()) Test()\x = 2 Procedure DebugList(c.l, List ParameterList.Point()) AddElement(ParameterList()) ParameterList()\x = 3 ForEach ParameterList() MessageRequester("List", Str(ParameterList()\x)) Next EndProcedure DebugList(10, Test())
Beispiel: Array als Parameter
Dim Table.Point(10, 15) Table(0,0)\x = 1 Table(1,0)\x = 2 Procedure TestIt(c.l, Array ParameterTable.Point(2)) ; Die Tabelle unterstützt 2 Dimensionen ParameterTable(1, 2)\x = 3 ParameterTable(2, 2)\x = 4 EndProcedure TestIt(10, Table()) MessageRequester("Table", Str(Table(1, 2)\x))
BeschreibungDeclare[.<Typ>] Name(<Parameter1[.<Typ>]> [, <Parameter2[.<Typ>] [= StandardWert]>,...])
Manchmal ist es notwendig, dass eine Prozedur von einer anderen Prozedur aufgerufen wird, bevor sie überhaupt deklariert wurde. Dies ist ärgerlich, da der Compiler dies mit 'Prozedur xxxx nicht gefunden' reklamiert. Das Deklarieren mit Declare kann in diesem konkreten Fall helfen, in dem zu Beginn nur der Kopf ('Header') der Prozedur deklariert wird. Nichtsdestotrotz, die Deklarierung des Headers und die tatsächliche Deklarierung der Prozedur müssen identisch sein (einschließlich der Typen-Angabe nach dem Prozedurnamen und optionaler Parameter, wenn vorhanden).
Für fortgeschrittene Programmierer ist DeclareC verfügbar und wird die Prozedur mit der 'CDecl' anstelle der 'StandardCall' Aufruf-Konvention deklarieren.
Beispiel
Declare Maximum(Wert1, Wert2) Procedure Operate(Wert) Maximum(10, 2) ; Zu dieser Zeit ist Maximum() nicht bekannt. EndProcedure Procedure Maximum(Wert1, Wert2) ProcedureReturn 0 EndProcedure