Function
 
Определяет процедуру, возвращающую значение

Синтаксис

[Public|Private] Function identifier [cdecl|pascal|stdcall] [Overload] [Alias external_identifier] [([parameter_list])] [As return_type] [Static] [Export]
statements
...
{ {Return [return_value]}|{Function = return_value}|{identifier = return_value} }
...
End Function

Параметры

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

Описание

Функция определяет блок кода, который может быть выполнен одной инструкцией (вызов функции) и предоставить значение обратно вызывающему объекту по окончании (возвращаемое значение). Существует несколько причин для использования функции:
  • Снижает размер кода в вашей программе
  • Позволяет повторно использовать код во многих программах
  • Улучшает читаемость программы
  • Улучшает отладку программы
  • Позволяет легко расширить программу

Права доступа : Ключевые слова Public и Private указывают глобальный или приватный доступ на уровня модуля, соответственно. Если ни дается, функция по умолчанию имеет доступ (Public).

Конвенция вызова : Конвенция вызова или порядок, в котором аргументы заталкиваются и извлекаются из стека во время вызовов функций, задаются ключевыми словами cdecl, pascal и stdcall. Если иное не указано, функция использует стандартное соглашение по умолчанию (stdcall).

Передача аргументов : Функции могут получать один или несколько переменных или аргументов, при вызове. Эти параметры перечислены как parameters в parameter_list. Ключевые слова ByRef и ByVal указывают, что аргумент будет передаваться по ссылке или по значению, соответственно. Задается тип аргумента "As type" после parameter. Если в параметре в объявлении указывается значение по умолчанию, параметр является необязательным. Параметры массива задаются идентификатором с пустыми скобками. Обратите внимание, что параметры массива всегда ByRef и ByRef ключевое слово не требуется и даже не разрешается для параметров с массивом. При вызове функции с аргументом массива скобки должны быть поставлены; см. примеры.

Перегрузка функций : Перегруженная функция может иметь одно и то же имя (identifier) с другой сигнатурой. Ключевое слово Overload указывает, что функция может быть перегружена. Функция должна быть определена или объявлена ,  используя ключевое слово Overload до любых функций, которые перегружают их.

Возвращение значений : return_type определяет тип данных , возвращаемый функцией при выходе. Если тип данных не указан, то функция вернет тип данных по умолчанию, который будет Integer если только не установлен другой тип данных с помощью DefSng, DefDbl, DefStr, и др. Функции могут возвращать значения с использованием трех методов: ключевое слово Return  после него сразу же значение. Данная команда заставляет выходить из функции, и возвращать это значение в вызывающую программу. Функции также могут возвращать значения, назначив после ключевого  слова Function или после identifier желаемое возвращаемое значение. Последние два метода не заставляют завершаться функцию. Поскольку функции возвращают значения, вызовы функций оцениваются в выражениях. Таким образом, вызовы функций могут быть сделаны в выражениях Присваивания или в заявлениях If. Скобки, окружающие список аргументов требуются при вызовах функций в выражениях и даже настоятельно рекомендуется, если нет аргументов. Функции также могут возвращать ссылки, указав Byref As return_type.

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

Пример


'' Эта программа демонстрирует декларацию функции 
'' и возвращает значение, используя команду Return

Declare Function ReturnTen () As Integer

Print ReturnTen () '' ReturnTen возвращает integer по умолчанию.

Function ReturnTen() As Integer
    Return 10
End Function


'' Эта программа демонстрирует декларацию функции 
'' и возвращает значение, используя имя функции

Declare Function ReturnTen () As Integer

Print ReturnTen () '' ReturnTen возвращает integer по умолчанию.

Function ReturnTen() As Integer
    ReturnTen = 10
End Function


'' Эта программа демонстрирует перегрузку функций.

'' Перегруженные функции должны быть Первыми.
Declare Function ReturnTen Overload (a As Single) As Integer
Declare Function ReturnTen Overload (a As String) As Integer
Declare Function ReturnTen (a As Integer) As Integer

Print ReturnTen (10.000!) '' ReturnTen будет принимать single и возвращать integer
Print ReturnTen (10)      '' ReturnTen будет принимать integer и возвращать integer
Print ReturnTen ("10")    '' ReturnTen будет принимать string и возвращать integer

Function ReturnTen Overload (a As Single) As Integer
    Return Int(a)
End Function

Function ReturnTen Overload (a As String) As Integer
    Return Val(a)
End Function

Function ReturnTen (a As Integer) As Integer
    Return a
End Function


'' В следующем примере демонстрируются необязательные параметры.

Function TestFunc(P As String = "Default") As String
    Return P
End Function

Print TestFunc("Testing:")
Print TestFunc


'' В этом примере показано, как объявить и вызвать 
'' функцию с массивом как аргумент функции.

Function x(b() As Double) As Integer
  x = UBound(b)-LBound(b)+1
End Function

Dim a(1 To 10) As Double
Print x(a())
Dim c(10 To 20) As Double 
Print x(c())


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

  • В диалекте -lang fb, ByVal является конвенцией передачи параметра по умолчанию для всех встроенных типов, за исключением String; Строки и определяемые пользователем Type передаются по ByRef по умолчанию.
  • В диалектах -lang qb и -lang fblite, ByRef является конвенцией передачи параметра по умолчанию.
  • В диалекте -lang qb, имя функции должно быть использовано для указания возвращаемого значения. Использование Function = ..." для указания возвращаемого значения не может быть использовано.
  • В диалектах -lang qb и -lang fblite, Return может быть использовано только для возврата значения когда Option Gosub отключена. В  -lang qb, это должно быть сделано явно с помощью Option Nogosub.

Отличия от QB

  • Параметры могут быть необязательными в FreeBASIC.
  • В QBASIC, возвращаемый тип может быть указан только с суффиксом, а не с AS TYPE, и допускаются только функции, которые возвращают встроенный тип.
  • Возвращаемое значение теперь может быть определено с помощью Return.
  • Перегрузка функций поддерживается в FreeBASIC.
  • Возвращаемое значение целого типа (все числовые типы, за исключением двух типов с плавающей запятой: single и double) могут быть проигнорированы в вызывающем коде.

См. также