Процедуры
Procedure | Declare |
ProcedureC | DeclareC |
Procedure[.<type>] Name(<parameter1[.<type>]> [, <parameter2[.<type>] [= DefaultValue]>, ...]) ... [ProcedureReturn value] EndProcedure
Описание
Процедура - это раздел программы, который независим от основного кода программы и может иметь свои параметры и переменные. В PureBasic полностью поддерживается рекурсии (повторение) процедур, каждая процедура может вызывать сама себя. При каждом вызове процедуры, локальным переменным автоматически присваивается значение 0. Для доступа к данным из основной программы, они должны быть объявлены с помощью ключевых слов Shared и Global (см. также Protected и Static).
У нескольких из последних параметров процедуры могут быть значения по умолчанию (должно быть выражение как константное), поэтому если эти параметры будут опущены при вызове процедуры, будет использоваться значение по умолчанию.
Массивы могут быть переданы как параметры, используя ключевое слово Array, а так же Связные списки, используя ключевое слово List и Хеш-карты, используя ключевое слово Map.
Процедура может возвратить значение или строку в случае необходимости. Необходимо установить тип после Процедуры и использовать ключевое слово ProcedureReturn в любом месте процедуры. Вызов ProcedureReturn немедленно покидает процедуру, даже если это происходит в пределах цикла.
ProcedureReturn не может использоваться, чтобы возвратить массив, связный список или хеш-карту. Для этого необходимо передать в процедуру массив, связный список или хеш-карту в качестве параметра.
Если для ProcedureReturn, не указано значение, то возвращаемое значение не определено (см. inline assembly для получения дополнительной информации).
Примечание: Для возврата строк из библиотек DLL, см. DLL.
Для опытных программистов доступна команда ProcedureC, чтобы вызвать процедуру используя соглашение о вызовах 'cdecl' вместо используемого по умолчанию 'stdcall'.
Выбранные процедуры могут быть выполнены асинхронно к основной программе при помощи потоков.
Пример: Процедура с числовой переменной как возвращаемое значение
Procedure Maximum(nb1, nb2) If nb1 > nb2 Result = nb1 Else Result = nb2 EndIf ProcedureReturn Result EndProcedure Result = Maximum(15, 30) Debug Result
Пример: Процедура со строкой как возвращаемое значение
Procedure.s Attach(String1$, String2$) ProcedureReturn String1$+" "+String2$ EndProcedure Result$ = Attach("PureBasic", "Coder") Debug Result$
Пример: Параметр со значением по умолчанию
Procedure a(a, b, c=2) Debug c EndProcedure a(10, 12) ; 2 будет использоваться в качестве значения по умолчанию для 3-го параметра a(10, 12, 15)
Пример: Список как параметр
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())
Пример: Массив как параметр
Dim Table.Point(10, 15) Table(0, 0)\x = 1 Table(1, 0)\x = 2 Procedure TestIt(c.l, Array ParameterTable.Point(2)) ; Поддержка массива с 2-мя измерениями ParameterTable(1, 2)\x = 3 ParameterTable(2, 2)\x = 4 EndProcedure TestIt(10, Table()) MessageRequester("Table", Str(Table(1, 2)\x))
Пример (Фран) ProcedureC
ImportC "" qsort(*base, num, taille, *ProcedureComparer) EndImport Dim valeurs.s(5) valeurs(0) = "40" valeurs(1) = "10" valeurs(2) = "100" valeurs(3) = "90" valeurs(4) = "20" valeurs(5) = "25" ProcedureC.i Comparer(*a.String, *b.String) ProcedureReturn Val(*a\s) - Val(*b\s) EndProcedure qsort(@valeurs(), ArraySize(valeurs()) + 1, SizeOf(String), @Comparer()) For n = 0 To 5 Debug valeurs(n) Next n
Пример: Статический, динамический массив и передача структуры в процедуру
Structure Whatever a.l b.l[2] ; Статический массив не изменяемого размера (стандарт C), с 2 значениями b [0] и b [1]. Array c.l(3, 3) ; Динамический массив с 16 значениями от c(0, 0) до c(3, 3), изменяемый с помощью ReDim() EndStructure MyVar.Whatever Procedure MyProcedure(*blahblah.Whatever) *blahblah\a = 5 *blahblah\b[0] = 1 *blahblah\b[1] = 2 *blahblah\c(3, 3) = 33 EndProcedure MyProcedure(@MyVar) Debug MyVar\a Debug MyVar\b[0] Debug MyVar\b[1] Debug MyVar\c(3, 3)
Пример: Вызов функции по ее имени
Prototype Function() Runtime Procedure Function1() Debug "Я вызываю Function1 по имени" EndProcedure Procedure LaunchProcedure(Name.s) Protected ProcedureName.Function = GetRuntimeInteger(Name + "()") ProcedureName() EndProcedure LaunchProcedure("Function1") ; Отобразит "Я вызываю Function1 по имени"
Declare[.<type>] Name(<parameter1[.<type>]> [, <parameter2[.<type>] [= DefaultValue]>, ...])
Описание
Иногда процедура должна вызвать другую процедуру, которая не была объявлена перед этим. В этом случай может произойти ошибка компиляции 'Procedureне найдена'. В данном случае может помочь Declare заявив только заголовок процедуры. Тем не менее, атрибуты функции Declare и фактическое объявление процедуры Procedure должны быть идентичны (включая указание правильного типа после имени процедуры).
Для опытных программистов доступна команда DeclareC чтобы объявить процедуру используя соглашение о вызовах 'cdecl' вместо используемого по умолчанию 'stdcall'.
Пример
Declare Maximum(Value1, Value2) Procedure Operate(Value) Maximum(10, 2) ; В это время процедура Maximum() не известна. EndProcedure Procedure Maximum(Value1, Value2) ProcedureReturn 0 EndProcedure
Пример (Фран)
Declare Maximum(Valeur1, Valeur2) Procedure Traitement() Resultat = Maximum(10, 2) ; На данный момент процедура Maximum() не известна компилятору. ProcedureReturn Resultat EndProcedure Procedure Maximum(Valeur1, Valeur2) If Valeur1 > Valeur2 Resultat = Valeur1 Else Resultat = Valeur2 EndIf ProcedureReturn Resultat EndProcedure Debug Traitement()