PureBasic

Global


Синтаксис
Global[.<type>] <variable[.<type>]> [= <expression>] [, ...]

Описание


Ключевое слово Global позволяет объявлять глобальные переменные, т.е. переменные которые объявили в основном коде, но которые становятся доступными в Процедурах. В этом случае команда Global должна быть вызвана для соответствующих переменных перед объявлением процедуры. Это правило верно везде, кроме одного случая: модули не имеют доступа к глобальным переменным объявленным вне этого модуля.
Допускается объявлять сразу несколько переменных в одной строке через запятую. В этом случае с помощью суффикса (<type> после слова Global) можно указать тип по умолчанию для переменных в этой строке, он сработает, если для какой либо из них тип не указан индивидуально. Если тип по умолчанию для объявления не указан, будет использован тип Integer.
Ключевое слово Global также может использоваться с Массивами, Связными списками и Хеш-картами.

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


Более подробно про переменные, объявления, типы данных и области видимости можно почитать здесь.

Пример: С переменными

Global a.l, b.b, c, d = 20

Procedure Change()
    Debug a  ; Будет 10, поскольку переменная является глобальной
EndProcedure

a = 10
Change()


Пример: С массивом

Global Dim Array(2)

Procedure Change()
    Debug Array(0) ; Будет 10, так как массив является глобальным
EndProcedure

Array(0) = 10
Change()


Пример: С типом по умолчанию

; 'Angle' and 'Position' будут типа float, так как для них индивидуально тип не указан
;
Global.f Angle, Length.b, Position


Пример: Комплекс с модулем

  Global Var_GlobalOutsideModule = 12
  Debug  Var_GlobalOutsideModule ; Отобразит 12

  DeclareModule Ferrari
    Global Var_GlobalModule = 308
    #FerrariName$ = "458 Italia"
    Debug #FerrariName$ ; Отобразит "458 Italia"
  
    ; Debug Var_GlobalOutsideModule ; Ошибка, переменная уже существует
    
    Debug Var_GlobalModule       ; Отобразит 308
  
    Declare CreateFerrari() 
  EndDeclareModule


  ; Частное
  ; ---------------------------------------------------------------------------------------
  Module Ferrari
    Debug Var_GlobalOutsideModule  ; Отобразит 0 <== Look !
    Debug Var_GlobalModule      ; Отобразит 308
  
    Global Initialized = 205
    Debug Initialized ; Отобразит 205
  
    Procedure Init()
      Debug Var_GlobalOutsideModule ; Отобразит 0
      Debug Var_GlobalModule     ; Отобразит 308
      Debug "InitFerrari()"  
    EndProcedure  
  
    Procedure CreateFerrari()    ; Общедоступно
      Init()
      Debug "CreateFerrari()"
      Debug Var_GlobalOutsideModule ; Отобразит 0
      Debug Var_GlobalModule     ; Отобразит 308
    EndProcedure
  
  EndModule


  ; Главный код
  ; --------------------------------------------------------------------------------------------- 
  Procedure Init()               
  
    Debug " init() from main code."
    Debug Var_GlobalOutsideModule ; Отобразит 12
    Debug Var_GlobalModule     ; Отобразит 0
  EndProcedure

  Init()

  Ferrari::CreateFerrari()
  Debug Ferrari::#FerrariName$ ; Отобразит 458 Italia
  Debug Var_GlobalOutsideModule  ; Отобразит 12
  ; Debug Var_GlobalModule    ;  Error, the variable already exists


  UseModule Ferrari           

  CreateFerrari()
  Debug #FerrariName$         ; Отобразит 458 Italia
  Debug Var_GlobalOutsideModule ; Отобразит 12
  Debug Var_GlobalModule     ; Отобразит 308 <== Look !

  UnuseModule Ferrari
  ; Debug #FerrariName$       ; Error, does not exist
  Debug Var_GlobalOutsideModule ; Отобразит 12
  Debug Var_GlobalModule     ; Отобразит 0 <== Look !