Область видимости переменной
 
Видимость и правила доступа для переменных и объектов

Область действия переменной относится к ее видимости в программе. Переменная не видна (не может быть доступна) , если она выходит за рамки области, в которой она был продекларирована. Где и как переменная продекларирована ​​определяет ее область видимости.

В Freebasic 4 категории области видимости: local, shared, common и common shared. Каждая из этих областей имеет свои правила видимости, которые подробно описаны ниже.

Локальная область видимости (local)


Переменные, продекларированные в локальной области видны только в самих локальных областях как IF, FOR, SCOPE, FUNCTION или в блоке модуля, в котором они продекларированы.

  • Sub, Function, тело main и каждый составной оператор неявно определяют новый блок локальной области.
  • Явно объявленные переменные, с помощью операторов Dim или ReDim берут локальную область, в которой они продекларированы.
  • Неявные переменные принимают локальную область Scope...End Scope, в котором они впервые начали использоваться, в противном случае принимают области Sub, Function, или main, в котором они используются.

В локальной области нет никакой видимости между кодом уровня модуля и кодом уровня функции. Кроме того, переменные, которые являются частью цикла будут видны только в блоке цикла. Переменные, объявленные в локальной области модуля не видны в любой из функций этого модуля. Аналогичным образом локальные переменные, объявленные внутри функции не видны в коде уровня модуля, так же как и не видны в любой другой функции в пределах модуля.

Переменные, объявленные внутри блоков Scope видны только в нем и не видны вне его. Однако блок Scope наследует окружающий Scope, поэтому локальные переменные, объявленные вне внутреннего блока Scope будут видны в нем (см. пример программы).

Вы можете объявить переменную для локальной области видимости явно с помощью инструкции Dim, или неявно(см. Неявная декларация). Пример программы local.bas демонстрирует правила видимости для локальной области видимости.

local.bas
'' видна только в этом модуле
Dim As Integer local_moduleLevel1

'' OK.
Print local_moduleLevel1

Scope
  '' OK; SCOPE блок наследует внешнюю область видимости(scope)
  Print local_moduleLevel1
  
  '' видна только в этом блоке SCOPE
  Dim As Integer local_moduleLevel2

  '' OK.
  Print local_moduleLevel2
End Scope

'' Ошибка; не видна будет данная переменная из прошлого блока Scope
'' print local_moduleLevel2

Function some_function( ) As Integer
  '' видна только в этой функции
  Dim As Integer local_functionLevel

  '' OK.
  Print local_functionLevel

  '' Ошибка; не видна будет данная переменная из основной области видимости уровня модуля 
  '' print local_moduleLevel1

  '' Ошибка; не видна будет данная переменная из области видимости Scope 
  '' print local_moduleLevel2

  Function = 0

End Function

'' print local_functionLevel                    '' Ошибка; не видна будет данная переменная из области видимости функции
End 0


Глобальная область видимости (Shared)


Переменные, объявленные в глобальной (shared) области модуля видны модулем и всеми функциями этого модуля.

В отличие от локальной области, глобальные области делают переменные видимыми для функций этого модуля. Другими словами модуль разделяет свои заявления с его функциями.

Глобальные переменные могут быть объявлены только в глобальной области на уровне модуля. То есть их нельзя объявлять в локальных областях вроде функций или блоках Scope.

Можно объявить переменную с помощью оператора DIM с ключевым словом Shared из глобальной области. Пример программы shared_scope.bas демонстрирует правила видимости для глобальной области.

shared.bas
'' видна во всем этом модуле
Dim Shared As Integer shared_moduleLevel1

'' OK.
Print shared_moduleLevel1

Scope
  '' OK; можно видеть переменные внешней области
  Print shared_moduleLevel1
  
  '' Ошибка; Нельзя создавать глобальные переменные в блоке Scope
  '' dim shared as integer shared_ModuleLevel2
End Scope

End 0

Function some_function( ) As Integer
  '' OK; можно видеть переменные глобальной области
  Print shared_moduleLevel1

  '' Ошибка; Нельзя создавать глобальные переменные в функции 
  '' dim shared as integer sharedFunctionLevel

  Function = 0
End Function


Общая область видимости (Common)


Переменные, объявленные в общей области являются видимыми для всех модулей.

Переменные, объявленные с Common могут видеть другие модули с соответствующими Common декларациями переменной. Имя декларированной переменной должно совпадать между модулями.

module1.bas
'' Компилировать:
''    fbc -lang qb module1.bas module2.bas

'$lang: "qb"

Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer
                      ' Это выполняется после всех остальных модулей
m1 = 1

Print "Module1"       
Print "m1 = "; m1     ' m1 = 1 как установлено в этом модуле
Print "m2 = "; m2     ' m2 = 2 как установлено в module2

Print_Values


module2.bas
Common m1 As Integer
Common m2 As Integer

m2 = 2

Print "Module2"       ' Это выполняется первым
Print "m1 = "; m1     ' m1 = 0 (по умолчанию)
Print "m2 = "; m2     ' m2 = 2

Sub Print_Values()
  Print "Module2.Print_Values"
  Print "m1 = "; m1   ' Неявная переменная = 0    
  Print "m2 = "; m2   ' Неявная переменная = 0  
End Sub


Вывод:
  Module2
  m1 = 0
  m2 = 2
  Module1
  m1 = 1
  m2 = 2
  Module2.Print_Values
  m1 = 0
  m2 = 0

Общая глобальная область видимости (Common Shared)


Переменные, объявленные в глобальной общей области, видны во всех модулях и во всех функциях этих модулей.

Переменные, объявленные с Common могут видеть другие модули с соответствующими Common декларациями переменной. Имя декларированной переменной должно совпадать между модулями. Спецификатор Shared создает видимость для декларированной с COMMON SHARED переменной для всех процедур и функций.

module3.bas
'' Компиляция:
''    fbc module3.bas module4.bas

Declare Sub Print_Values()
Common m1 As Integer
Common m2 As Integer

'' Это выполняется после всех других модулей
m1 = 1

Print "Module3"       
Print "m1 = "; m1     '' m1 = 1 как установлено в этом модуле
Print "m2 = "; m2     '' m2 = 2 как установлено в module2

Print_Values


module4.bas
Common Shared m1 As Integer
Common Shared m2 As Integer

m2 = 2

Print "Module4"       '' Это выполняется первым
Print "m1 = "; m1     '' m1 = 0 (по умолчанию)
Print "m2 = "; m2     '' m2 = 2

Sub Print_Values()
  Print "Module4.Print_Values"
  Print "m1 = "; m1   '' m1 = 1    
  Print "m2 = "; m2   '' m2 = 2
End Sub


Вывод:
  Module4
  m1 = 0
  m2 = 2
  Module3
  m1 = 1
  m2 = 2
  Module4.Print_Values
  m1 = 1
  m2 = 2

Пример

См. примеры выше.

См. также