Globálne premenné

variable scope

Premenné aj funkcie majú svoj rozsah platnosti, čiže oblasť, v ktorej fungujú a v ktorej nie. V prípade premennej, ktorá je deklarovaná (definovaná) pod premennou, ktorá ju volá pre ňu neexistuje. Viditeľnosť premennej môžeme označiť ako:

Globálna premenná – platí v celom programe. Umiestňuje sa mimo (nad) definíciu funkcie setup(). Môžu ich používať všetky funkcie definované pod nimi. K použitiu globálnych premenných sa vyhnite, pretože vedie k zlým návykom.

Lokálna premenná – je definovaná vo vnútri funkcie. Môže ich teda používať iba táto funkcia. Povedané inak, lokálna premenná platí iba medzi dvoma {}. Viaceré funkcie môžu mať lokálne premenné s tým istým menom, každá používa tú svoju. Ak má lokálna a globálna premenná to isté meno, lokálna premenná prekryje globálnu, funkcia teda používa svoju lokálnu premennú (bližšia košeľa ako kabát). Ak by som sa ale predsa len potreboval dostať ku globálnej premennej, tak je na to operátor rozšírenia platnosti ::.

int x;  // premennú "x" vidí akákoľvek funkcia v programe (globálna premenná)

void setup()
{
  // ...
}

void loop()
{
  int i;    // premenná "i" je viditeľná vo vnútri funkcie "loop" (lokálna premenná)
  float f;  // premenná "f" je viditeľná vo vnútri funkcie "loop" (lokálna premenná)
  // ...

  for (int j = 0; j <100; j++){
    // premenná "j" je viditeľná len tu v slučke for (lokálna premenná)
    // taktiež sú tu viditeľné aj premenné "x", "i" aj "f"
  }

 // premenná "j" už tu neexistuje
}

void mojaFunkcia() {
  int z;    // premenná "z" je viditeľná len vo vnútri funkcie "mojaFunkcia"
            // taktiež je tu viditeľná premenná "x"
  
// ... 
}

static

Ak pri lokálnej premennej použijeme špecifikátor static, premenná nezanikne ak vyskočíme z funkcie (z bloku {}), ale nestáva sa z nej globálna premenná, takže je platná len pre danú funkciu. Keby sme static neuviedli, tak by premenná zanikla pri najbližšom konci funkcie a znovu by sa inicializovala pri zavolaní funkcie.

void mojaFunkcia()  {
    static int x = 0;   // premenná "x" sa inicializuje len raz pri prvom spustení tejto funkcie
    x++;
}

// premenná "x" nezanikla a jej hodnota je zachovaná aj mimo funkcie 
// ale premenná "x" nieje viditeľná mimo tejto funkcie, nedá sa jej hodnota meniť

volatile

Deklarácia premennej typu volatile je direktíva pre kompilátor. Určuje, že si neželáme aby bola premenná v rámci optimalizácie nejak presúvaná v pamäti. Toto je dôležité ak existuje spôsob ako meniť túto premennú aj inak ako v programe, napríklad zvonka nejakým vstupom (prerušením – interrupts) z vonkajšieho hardware. Ak by program uloženie premennej nejak optimalizoval a nebola by počas celého programu tam kde mala, tak by vonkajší proces zapisoval hodnoty niekde úplne inde. Teda, čo je volatile s tým program nehýbe.

// prepína LED pri prerušení, pin zmení stav

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

const

Vraví o tom, že premenná bude konštantná a teda sa nebude dať meniť počas behu programu. Táto premenná je “len pre čítanie”. To znamená, že premenná môže byť použitá rovnako ako akákoľvek iná premenná svojho typu, ale jej hodnota nemôže byť zmenená. Dostanete chybu kompilátora, ak sa pokúsite priradiť akúkoľvek hodnotu premennej typu const. Je dôležité, že hneď pri deklarácii musí byť aj definovaná. Doporučované je deklarovať konštanty použitím const ako používať #define.

const float pi = 3.14;
float x;

// ....

x = pi * 2;    // použitie konštanty "pi" vo výpočte

pi = 7;        // chybný zápis - konštantu nieje možné modifikovať

const volatile je to aj konštanta a aj sa s ňou nehýbe v pamäti (a tak vonkajší proces môže vždy načítať hodnotu premennej a nemusí sa báť, že by ju nenašiel na tom mieste kde má byť. Zapisovať do nej (do konštanty) ale nemôže).

Tento text je preložený a upravený zo stránok arduino.cc pod licenciou Creative Commons Attribution-ShareAlike 3.0.

Výber na čítanie...

ako na ošetrenie spínacích kontaktov - debouncing
Ako na ošetrenie spínacích kontaktov – debouncing

Všeobecne najčastejším spôsobom ovládania aplikácií Arduinom s okolitým svetom sú tlačítka, klávesnice (membránové, kapacitné alebo s mikrospínačmi), rotačné enkódery (rotation encoders, inkrementálne otočné ovládače) a rad ďalších spínačov, pracujúcich na...

Čítať viac...

KiCad je nástroj pre návrh schémy a plošných spojov
KiCad

Program KiCad je open source nástroj určený pre návrh schém a plošných spojov. Jeho využitie je založené na tom, že umožňuje inžinierom a elektronikom vytvárať vlastné...

Čítať viac...

Knižnica pre Arduino EEPROM.h
EEPROM.h

Knižnica pre Arduino EEPROM.h sa využíva na čítanie a zápis dát do internej pamäte EEPROM. To je tá časť pamäte, ktorá si zachová uložené dáta aj po vypnutí napájania Arduina. Veľkosť tejto pamäte je daná mikrokontrolérom, napr. ATmega328 má 1024 bajtov, ATmega1280 ...

Čítať viac...

Obľúbené produkty...

Keyestudio Multi-purpose Shield V2

8.07 EUR

8.07 EUR

Vyhľadať články
Programovanie...
  • Aritmetické operátory

    Aritmetické operátory vykonávajú matematické operácie dvoch výrazov jednej alebo viacerých typov ...

  • Funkcie náhodných čísiel

    Náhodné čísla zvyčajne pozostávajú zo zložitých sérií algoritmov, ktoré sú štatisticky predvídate...

  • Špeciálne operátory

    Spomenieme ešte špeciálne operátory alebo špeciálne znaky, ktoré sa používajú pri programovaní a ...

  • Ostatné IO funkcie

    U Arduina je možné generovať i zvuk, ale iba v najjednoduchšej podobe. Neumožňuje totiž generovať...

  • Digitálne IO funkcie

    Keďže je Arduino určené k ďalšiemu rozširovaniu, obsahuje vstupy a výstupy (nazývané piny), ku kt...

Podpora webu
Na kávu už prispeli
Dátum Meno Suma
08.01.2024 Veres Dusan 10€
15.05.2023 Ivan Danis 10€
28.09.2022 Ivan Vrab 7€
14.05.2022 Nemcic Marian 10€
04.02.2022 Robert Bilko 5€
29.01.2022 Peter Buffa 5€
19.11.2021 Rastislav Rehak 5€
16.09.2021 Anton Strela 5€
13.09.2021 Juraj Jedlak 5€
02.09.2021 Michal Marek 7€
08.08.2021 František Uhrík 5€
21.07.2021 Juraj Hrdina 5€
25.03.2021 Jan Nemec 10€
16.03.2021 Igor Pavlov 5€
25.02.2021 Lukas Lacuch 5€
06.11.2020 Pavol Balint 5€
05.11.2020 Marek Horečný 5€
05.10.2020 Jan Kusnir 5€
27.04.2020 Jan Zuskin 15€
26.04.2020 Dušan Sojka 5€
24.02.2020 Juraj Lackanič 5€
22.01.2020 František Žilinec 10€
20.05.2018 Tomáš F. 2€
17.12.2018 Pavol P. 5€
QR Donate 10Eur