6. Zmienne globalne i lokalne.

6.2. Nałożenie obszarów lokalnych

W przypadku jeśli wewnątrz jakiegoś obszaru lokalnego (np. w ciele funkcji OnStart()) zostanie utworzony inny obszar lokalny (np. operatora if), to zmienne utworzone w OnStart() będą widoczne dla programu również i w tym nowym obszarze. Przeanalizujmy poniższy przykład (kod 1).

Kod 1
#property strict

int  GlobalVariable = 555;
bool GlobalFlag = true;

//--- granica obszaru lokalnego OnStart(), początek
void OnStart()
  {
   int LocalVariable = 7;
   //--- granica obszaru lokalnego 'if', początek
   if(GlobalFlag == true)
     {
      Print("GlobalVariable = ",GlobalVariable);
      Print("LocalVariable = ",LocalVariable);
     }
   //--- granica obszaru lokalnego 'if', koniec
  }
//--- granica obszaru lokalnego OnStart(), koniec

Korzystając z mocy naszej wyobraźni, spróbujmy teraz zobaczyć ten kod w 3D (rys. 1).

Rys. 1. Schemat programu: poziom globalny i obszary lokalne.


Wiemy już, że zmienne globalne są widoczne dla programu we wszystkich obszarach lokalnych, dlatego skupmy się teraz na zmiennych lokalnych. W powyższym kodzie 1 w OnStart() najpierw została zainicjonowana zmienna LocalVariable (platforma nr 2, rys. 1). Następnie operator if tworzy nowy obszar lokalny (platforma nr 3), znajdujący się wewnątrz obszaru utworzonego przez OnStart(). Gdyby warunek if(GlobalFlag == true) okazał się fałszywy, wtedy program nie musiałby wykonywać zadań wymaganych przez ten operator i nowy obszar by nie powstał.

W naszym przypadku warunek jest prawdziwy (GlobalFlag == true, tj. true == true to prawda), dlatego program otrzyma zadanie wyświetlić komunikaty za pomocą dwóch funkcji Print(). W 1 przypadku program będzie musiał skorzystać ze zmiennej globalnej GlobalVariable, a w 2 przypadku ze zmiennej lokalnej LocalVariable z "niższego" obszaru. Mówiąc inaczej, będąc na wyższej platformie, program widzi zmienne utworzone na "niższych" platformach.

Jeśli wewnątrz obszaru lokalnego if za pomocą jakiegoś operatora utworzymy nowy obszar lokalny, a w nim kolejny itd., to będąc na "wyższych" platformach program nadal będzie widział zmienne utworzone na wszystkich "niższych" platformach. Zobaczymy to na przykładzie kodu 2.

Kod 2
#property strict

//--- inicjalizacja dwóch zmiennych globalnych
int  GlobalVariable = 555;
bool GlobalFlag     = true;

//--- 2. granica obszaru lokalnego OnStart(), początek
void OnStart()
  {
   int LocalVariable = 7;  // inicjalizacja zmiennej lokalnej
   //--- 3. granica obszaru lokalnego 'if' dla GlobalFlag, początek
   if(GlobalFlag == true)
     {
      //--- 4. granica obszaru lokalnego 'if' dla GlobalVariable, początek
      if(GlobalVariable == 555)
        {
         //--- 5. granica obszaru lokalnego 'if' dla LocalVariable, początek
         if(LocalVariable == 7)
           {
            Print("GlobalVariable = ",GlobalVariable);
            Print("LocalVariable = ",LocalVariable);
           }
         //--- 5. granica obszaru lokalnego 'if' dla LocalVariable, koniec
        }
      //--- 4. granica obszaru lokalnego 'if' dla GlobalVariable, koniec
     }
   //--- 3. granica obszaru lokalnego 'if' dla GlobalFlag, koniec
  }
//--- 2. granica obszaru lokalnego OnStart(), koniec

Popatrzmy na ten kod "z boku" (rys. 2).

Rys. 2. Piramida obszarów lokalnych.


Na tym schemacie widzimy, że na poziomie globalnym (platforma nr 1) zainicjowano 2 zmienne globalne - GlobalVariable i GlobalFlag. W obszarze lokalnym, utworzonym przez OnStart() (platforma nr 2), zainicjowano 1 zmienną lokalną LocalVariable. Dalej za pomocą 3-ch operatorów if tworzone są 3 obszary lokalne, z których każdy znajduje się wewnątrz poprzedniego obszaru.

Na platformie nr 3 program potrzebuje mieć dostęp do GlobalFlag, aby móc sprawdzić warunek if(GlobalFlag == true). Na 4-ej platformie dostęp do GlobalVariable, aby sprawdzić warunek if(GlobalVariable == 555). Na 5-ej potrzebuje dostęp do LocalVariable w celu sprawdzenia warunku if(LocalVariable == 7) oraz do GlobalVariable i LocalVariable w funkcjach Print(). Program nie ma problemu z dostępem do tych zmiennych, dlatego że zostały one utworzone w poprzednich obszarach, tj. na "niższych" platformach (rys. 2, żółte i zielone strzałki).