PureBasic

Процедуры

Краткое описание функций:
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()