Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Zmienne lokalne statyczne


Autor: Dondu

Kurs języka C: Spis treści

Zmienna lokalna statyczna, to zmienna dostępna w danej funkcji lub bloku i jej wartość jest pamiętana w po opuszczeniu funkcji, czy bloku.

Wartość "zwykłej" zmiennej lokalnej jest tracona w momencie opuszczenia funkcji lub bloku, natomiast wartość zmiennych statycznych nie jest tracona, przez co możliwa do wykorzystania przy następnym wejściu do funkcji lub bloku.
{  //początek bloku

  //... jakiś kod

  static char nazwa_zmiennej;  //zmienna lokalna statyczna typu char

  //... jakiś kod

}  //koniec bloku

Zobaczmy przykład dla funkcji:

Przykład 1 (w kompilatorze)
 
void pokaz(void)
{
  //zmienna lokalna statyczna, której wartość jest pamiętana w funkcji
  static char ilosc_koni = 1;
  
  //zmienna lokalna "zwykła" 
  char ilosc_kotow = 1;
  
  //wyświetl zmienne
  printf("- ilosc_koni = %d \n", ilosc_koni);
  printf("- ilosc_kotow = %d \n\n", ilosc_kotow);
  
  //powiększ zmienne
  ilosc_koni = ilosc_koni + 1;  
  ilosc_kotow= ilosc_kotow + 1;  
}

int main(void)
{
  printf("Pierwsze wywolanie funkcji:\n");
  pokaz();     //wywołaj funkcję pokaz()

  printf("Drugie wywolanie funkcji:\n");
  pokaz();     //wywołaj funkcję pokaz()

  printf("Trzecie wywolanie funkcji:\n");
  pokaz();     //wywołaj funkcję pokaz()

  return 0;
}


Teraz sprawdzimy, czy w zakresie bloku jest tak samo. Jako blok wykorzystamy pętlę do{ } while( ):

Przykład 2 (w kompilatorze)
int main(void)
{
 
  //zmienna pomocnicza - licznik pętli
  char licznik = 1;
  
  do 
  {
    printf("Petla nr: %d\n", licznik);
    
    //zmienna lokalna statyczna, której wartość jest pamiętana w funkcji
   static char ilosc_koni = 55;
  
   //zmienna lokalna "zwykła" 
   char ilosc_kotow = 40;

    //wyświetl zmienne
    printf("- ilosc_koni = %d \n", ilosc_koni);
    printf("- ilosc_kotow = %d \n\n", ilosc_kotow);
    
    //powiększ zmienne
    ilosc_koni = ilosc_koni + 1;  
    ilosc_kotow= ilosc_kotow + 1;  

  }
  while(++licznik <= 5);
  
  return 0;
}

Jak widzisz wartość zmiennej static jest pamiętana w zakresie bloku, niezależnie, czy blokiem tym jest funkcja, pętla, czy sam blok.

Kurs języka C: Spis treści

7
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

2 komentarze:

  1. Ot taka tam dywagacja... Zawsze mnie zastanawiało, dlaczego przy powtórnym użyciu zmienna statyczna nie jest nadpisywana wartością, którą jej przypisujemy podczas deklaracji. Rzutując to na przykład numer 2, każdorazowe wywołanie linii "static char ilosc_koni = 55;" może błędnie sugerować początkującemu programiście, że wartość 55 zostanie przypisana zmiennej "ilosc_koni" przy każdym przejściu przez pętlę "do". Trzeba przyznać, że twórcy języka C stworzyli tutaj coś mało intuicyjnego. Choć z drugiej strony, ten kto świadomie zaczyna używać zmiennych statycznych, raczej wie co jest grane ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Aby odpowiedzieć na to pytanie trzeba się zagłębić nieco w sposób w jaki program jest kompilowany i linkowany oraz w kod rozruchowy C. Ogólnie, zmienne statyczne trafiają do specjalnej sekcji pamięci, która jest inicjalizowana wartościami początkowymi tylko raz, przez kod startowy programu C. Stąd też zmienna ilosc_koni ma nadawaną wartość początkową nie w chwili wejścia do funkcji, w której jest zdefiniowana, lecz w chwili startu programu C. Zmienne statyczne można więc traktować jak zmienne globalne, z tym, że ograniczona jest widoczność zmiennej do bloku w którym została zdefiniowana.

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.