Sub
 
Определяет процедуру

Синтаксис

[Public|Private] Sub identifier [cdecl|pascal|stdcall] [Overload] [Alias external_identifier] [( [parameter_list] )] [Static] [Export]
statements
...
[Return]
...
End Sub

[Public] Sub identifier [cdecl|pascal|stdcall] [Overload] [Alias external_identifier] [()] [Constructor|Destructor] [Static]
statements
...
[Return]
...
End Sub

Параметры

identifier: имя процедуры
external_identifier: Внешнее (для компоновщика) имя, заключенное в кавычки
parameter_list: parameter[, parameter[, ...]]
parameter: [ByRef|ByVal] identifier [As type] [= default_value]
identifier: имя переменной, на которое ссылается процедура
type: тип переменной
default_value: значение аргумента, если не задано в вызове
statements: один или несколько операторов, которые составляют тело процедуры

Описание

Процедурой является блок кода, который можно вызвать в любое время из программы. Этот код может потребоваться для выполнения по нескольку раз, и процедуры представляют собой весьма ценное средство для упрощения кода, заменив эти блоки кода одним вызовом процедуры. Процедура также служит для расширения языка FreeBASIC, предоставляя пользовательские команды. Многие из функций, встроенных в FreeBASIC являются лишь частью процедур "runtime library".

Ключевое слово Sub знаменует собой начало процедуры, а ее конец отмечается с помощью End Sub. Параметр "identifier" - это имя, под которым эта процедура вызывается. Например, если декларация "Sub foo...End Sub", пользователь может выполнить код между "Sub foo" и "End Sub" с помощью "foo" как оператора. Этот код выполняется отдельно от кода, который вызывает процедуру, поэтому любые имена переменных, если они не являются общими, не доступны в процедуре. Однако значения могут быть переданы с помощью параметров.

Параметры - это аргументы, переданные к любому заявлению. Например, если пользователь выполняет заявление как "Print 4", значение "4" передается в функцию "Print". Параметры, которые должны быть переданы в процедуру поставляются одним или несколькими аргументами параметров в ключевое слово "Sub". Создание подпрограммы с "Sub mysub(foo, bar)...End Sub", позволяет код между "Sub" и "End Sub" для обозначения первого заданного аргумента как "foo" , а второго передаваемого аргумента как "bar". Если параметр задается со значением по умолчанию, то параметр является необязательным.

В диалекте по умолчанию -lang fb, параметры также должны иметь прилагаемый тип, в виде "parameter as type". Тип суффикса не допускается.

В диалектах -lang qb и -lang fblite , дается тип по умолчанию, если тип явно не задается либо по имени, либо по типу суффикса. Тип по умолчанию Single в диалекте -lang qb , и Integer в диалекте -lang fblite.

Процедура может также указать, как передаются параметры, то есть,  либо как "ByRef" , либо как "ByVal", как показано в определении синтаксиса. Если параметр "ByRef", имя параметра буквально становится ссылкой на исходную переменную,  передаваемую в процедуру. Любые изменения, внесенные в эту переменную будут отражены за пределами процедуры. Если параметр передается как "ByVal", значение любой переданной переменной копируется в новую переменную, и любые изменения, внесенные в нее не повлияют на оригинал. (Обратите внимание: это в настоящее время не применяется к типу String, и "ByVal" следует избегать с этим типом в настоящее время.)

Static спецификатор указывает на то, что значения всех локальных переменных, определенных в процедуре должны быть сохранены между вызовами. Чтобы указать отдельные локальные переменные как статические см. ключевое слово Static.

Sub такая же, как Function, за исключением того, что не возвращает значение.

Второй синтаксис определяет либо конструктор , либо деструктор с помощью ключевых слов Constructor и Destructor соответственно. Конструктор подпрограммы выполняются перед первой строкой кода в модуле, а деструктор выполняется после последней строчки кода в модуле перед выходом. Обратите внимание на спецификатор доступа Public и пустой список параметров для обоих конструкторов и деструкторов.

Пример

'' Пример написания цветного текста, используя Sub:

Sub PrintColoredText( ByVal colour As Integer, ByRef text As String )
   Color colour
   Print text
End Sub

   PrintColoredText( 1, "blue" )        '' несколько цветов
   PrintColoredText( 2, "green" )
   PrintColoredText( 4, "red" )
   Print
   
   Dim i As Integer
   For i = 0 To 15                        '' все 16 цветов
      PrintColoredText( i, ("color " & i) )
   Next i

' Ниже показан пример с необязательными параметрами.

Sub TestSub(P As String = "Default")
    Print P
End Sub

TestSub "Testing:"
TestSub


Различия диалектов

  • Диалекты -lang qb и -lang fblite используют конвенцию QB: параметры передаются по умолчанию по ByRef.
  • В диалекте -lang fb , числовые параметры передаются по умолчанию по ByVal. String (строковые) и UDT параметры по умолчанию передаются по ByRef.

Отличия от QB

  • Спецификаторы доступа Public и Private являются новыми возможностями в FreeBASIC.
  • Конструктор процедуры является новой возможностью в FreeBASIC.

См. также