Premenné a dátové typy

Premenné sú pamäťové miesta prístupné prostredníctvom identifikátoru. Hodnotu premenných môžeme počas výpočtu meniť. Tým sa premenné zásadne odlišujú od konštánt, ktoré majú po celú dobu chodu programu hodnotu nemennú - konštantnú. Premenné deklarujeme uvedením dátového typu, ktorý je nasledovaný identifikátorom, alebo zoznamom identifikátorov, navzájom oddelených čiarkami. Deklarácia končí bodkočiarkou. Súčasne s deklaráciou premennej môžeme, ale nemusíme, definovať aj jej počiatočnú hodnotu.

Celočíselné dátové typy môžu obsahovať modifikátory unsigned respektíve signed, čím môžeme požadovať hodnoty príslušného typu bez znamienka, resp. so znamienkom (Tento variant je často používaný pri type char, kde môže byť zdôraznený ako signed char,).

void

Dátový typ void je použitý iba v deklarácii funkcie. To znamená, že od funkcie sa neočakávajú žiadne návratové informácie.

// program je vykonávaný vo funkcii "setup" a "loop", ale funkcia žiadne hodnoty nevráti

void setup()
{
  // ...
}

void loop()
{
  // ...
}

boolean

je implementáciou pravdivostného typu. Môže obsahovať dve možné hodnoty (logické konštantytrue pravda a false nepravda, ktorým tiež prislúcha určitý rozsah číselných hodnôt, väčšinou false = 0 a true >= 1.

boolean b = false;
 Tieto premenné sa hojne využívajú pre vyhodnocovanie najrôznejších podmienok a budeme sa s nimi často stretávať.


char, unsigned char

Pre uloženie jednotlivých znakov do pamäti sa používajú premenné typu char. Veľkosť typu char je 1 byte, čo znamená, že môžete použiť 255 znakov. Každý znak je uzavretý medzi dvomi apostrofmi (napr. 'C'). Všetky znaky sú navzájom usporiadané v tzv. ASCII tabuľke - táto obsahuje 256 znakov.

char myChar = 'A';
char myChar = 65;      // obe varianty sú si ekvivalentné
unsigned char myChar = 240;
Znaky sú uložené v premennej myChar ako čísla určené podľa kódovania v ASCII tabuľke. To znamená, že je možné vykonávať aj aritmetické operácie na znakoch napr. 'A' + 1 má hodnotu 66, pretože hodnota ASCII veľkého písmena A je 65. Taktiež je možné znak definovať nielen v desiatkovej sústave číslom 65 ale aj v šetnástkovej sústave číslom 0x41, prípadne aj binárnym zápisom.

Dátový typ char je typ signed, čo znamená, že kóduje čísla od -128 do 127. Dátový typ unsigned char kóduje čísla od 0 do 255, čo je vlastne dátový typ byte.


byte

Dátový typ byte ukladá 8-bitové číslo od 0 do 255, to je vlastne jeden byte.
 
byte b = B10010;  // "B" je binárny formát (B10010 = 18 desiatkovo)
byte x = 128; 

Označuje sa aj ako uint8_t.


int, unsigned int

Jeden z najpoužívanejších dátových typov int (od slova integer - celé číslo) môže nadobúdať hodnoty 16-bitové (2 bajty) alebo 32-bitové (4 bajty) a to podľa typu použitého procesoru - napr.: Arduino Uno (a ostatné ATMega dosky s 8-bitovými procesormi) majú hodnoty int ako 16-bitové a Arduino Due (s 32-bitovým procesorom) používa hodnotu int ako 32-bitové číslo. Na toto treba myslieť pri tvorbe programu, ktorý môže bežať na rôznych platformách.

int x = 13;
unsigned int ledPin = 13;
Dátový typ int ukladá 16-bitové číslo od -32.768 do 32.767 (int16_t) a 32-bitové číslo od 2.147.483.648 do 2.147.483.647 (int32_t).  
Dátový typ unsigned int ukladá 16-bitové číslo od 0 do 65.535 (uint16_t). a 32-bitové číslo od 0 do 4.294.967.295 (uint32_t).


word

Na doskách Uno (a ostatných ATMEGA) je dátový typ word uložený ako 16-bitové unsigned číslo. Na doskách Due a Zero (32-bit procesor) je uložené ako 32-bitové unsigned číslo. 

word w = 10000; 
Výsledok je ten istý ako unsigned int, len zápis word je kratší na počet písmen.


long, unsigned long

Dátový typ long je dlhé celé číslo a ukladá 32 bitové čísla (4 bajty) od -2.147.483.648 do 2.147.483.647 a dátový typ unsigned long ukladá 32 bitové čísla od 0 do 4.294.967.295 

long x = 45789;
unsigned long time;


short

Dátový typ short je celé 16-bitové číslo (2 bajty) v rozsahu od -32.768 do 32.767.

short ledPin = 13;
Všetky Arduina (ATMega aj ARM) ukladajú typ short ako 16-bitové číslo.

Pre lepšiu predstavu dáva nasledujúca tabuľka prehľad niektorých vlastností dátových typov pre celé čísla:

typ         bitov   rozsah                           zápis

int8_t      8       -128 - 127                       char
int16_t     16      -32.768 - 32.767                 short, int*
int32_t     32      -2.147.483.648 - 2.147.483.647   long, int**

uint8_t     8       0 - 255                          byte, unsigned char
uint16_t    16      0 - 65535                        word*, unsigned int* 
uint32_t    32      0 - 4,294,967,295                unsigned long, word**, unsigned int**

*  pre  8-bitový procesor (Arduino Uno, ATMEGA, ...)
** pre 32-bitový procesor (Arduino Due, Zero, ...)

float

Typ premennej float je určený pre reálne čísla s desatinnou čiarkou v rozsahu od -3.4028235E+38 do 3.4028235E+38 . Alokácia premennej float vyžaduje 32-bitov (4 bajty). Pre predstavu, rozloženie premennej môže vyzerať takto: 24 bitov je určené pre mantisu a 8 bitov pre exponent.

float teplota;
float sensor = 1.117;

Vzhľadom na to, že dátový typ float je zložený z dvoch častí, ktoré nesú informáciu o skutočnej hodnote reálneho čísla, môže nastať situácia, že výpočet bude mimo rozsah a vtedy nastane nedefinovateľná modifikácia jednej z častí (mantisa, exponent) a výsledok bude špatný. Všetko sa žiaľ stane bez informácie o presahu povolených medzí. Treba myslieť na to, že čísla s plávajúcou desatinnou čiarkou nie sú presné a môžu priniesť podivné výsledky pri porovnaní. Napríklad 6.0 / 3.0 nemusí sa rovnať 2.0. Taktiež výpočet s plávajúcou čiarkou je oveľa pomalší ako výpočet s celým číslom.

int x;
int y;
float z;

x = 1;
y = x / 2;            // y má hodnotu 0, lebo je typu celé číslo
z = (float)x / 2.0;   // z teraz obsahuje .5 (treba použiť 2.0 a nie 2)

Desatinné čísla sa píšu s bodkou a nie s čiarkou ako sme zvyknutí.


double

je racionálne číslo s dvojitou presnosťou. Opäť pozor na to, že na doskách Uno (a ostatné ATmega) zaberá hodnota 32-bitov (4 bajty), to je ako použitie float  (tu už strácame dvojitú presnosť), ale na doskách Arduino Due (32-bit procesor) zaberá hodnota double 64-bitov (8 bajtov).

V programovacích jazykoch sa ešte používa aj long double čo je reálne číslo najväčšie (má veľkosť 80-bitov).


Pre lepšiu predstavu dáva nasledujúca tabuľka prehľad niektorých vlastností racionálnych dátových typov:

typ         bitov   mantisa   exponent   rozsah absolútnych hodnôt (približne)
float       32      24        8          3.4 10-383.4 10+38
double      64      53        11         1.7 10-3081.7 10+308
long double 80      64        15         3.4 10-49321.1 10+4932

Presne definuje racionálne dátové typy norma IEEE 754.


string - znakové pole

Reťazec znakov (string) je zvláštnym druhom jednorozmerného poľa. Sú zložené z prvkov typu char. Reťazce sú základom textových a databázových súborov. Reťazcové konštanty zapisujeme v programe ako postupnosť znakov uzavretých medzi úvodzovkami. V pamäti je reťazec ukončený znakom  '\0', ale pri vypisovaní to nepoznať, lebo tento znak je "neviditeľný" a nemusíme ho zapisovať. Naopak, v prípade, že omylom zmažeme tento znak, programy pracujúce s reťazcom dovtedy budú hľadať koniec reťazca pokiaľ náhodne nenarazia na najbližší znak  '\0'

Možnosti pre deklarovanie reťazca arduino v poli Str[]:

  char Str1[15];
  char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
  char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
  char Str4[ ] = "arduino";
  char Str5[8] = "arduino";
  char Str6[15] = "arduino";

- znakové pole s definovaním veľkosti pola bez úvodnej inicializácie znakov - prázdne znakové pole
- znakové pole s definovaním veľkosti pola a s inicializáciou jednotlivých znakov v apostrofoch oddelených čiarkov (zápis znakov je ako pri dátovom type char)
- znakové pole s definovaním veľkosti pola a s inicializáciou jednotlivých znakov v apostrofoch oddelených čiarkov vrátane ukončovacieho znaku '\0'
- znakové pole bez definície veľkosti pola a s inicializáciou reťazca v úvodzovkách "arduino"
- znakové pole s definovaním veľkosti pola a s inicializáciou reťazca v úvodzovkách "arduino"
- znakové pole s definovaním veľkosti pola (väčšieho) a s inicializáciou reťazca v úvodzovkách "arduino"

Počet prvkov poľa sa určuje pri deklarácií. Údaj o počte prvkov je možné v deklarácií vynechať (ak je pole definované inde) alebo v definícií (kde inicializujeme všetky prvky). Pri definícii je možné pole zároveň aj inicializovať. Vtom prípade nasleduje za menom poľa a hranatými zátvorkami znak rovnosti a za ním v zložených zátvorkách hodnoty, ktoré sa majú priradiť jednotlivým prvkom. V prípade stringov nahradia zložené zátvorky dvojité úvodzovky. Za platnými znakmi string sa automaticky doplní o koncový znak '\0'. Pozor na číslo v hranatých zátvorkách. Koncový znak musí byť súčasťou stringu (započítava sa!). Ak nezadáme  údaj o rozmere poľa, určí si ho prekladač na základe počtu platných prvkov uvedených pri inicializácii. V prípade reťazca znakov rozmer poľa sa nastaví na počet platných znakov  +1 (ukončovací  '\0') naviac. V prípade poľa znakov obsahujúceho kratší string než je dĺžka poľa (t.j. za hodnotou  '\0' do konca poľa budú voľné pozície) bude až do konca poľa obsahovať náhodné údaje.  


String - objekt

Trieda String umožňuje používať a manipulovať s reťazcami textu zložitejšími spôsobmi ako znakové pole. Môžete reťazce spájať, vyhľadávať, nahrádzať a podobne. To si vyžaduje viac pamäte ako jednoduché pole znakov, ale je to tiež užitočné. Pre porovnanie, znakové pole je označované ako reťazce s malým písmenom s (string) a inštancia triedy String je označovaná s veľkým písmenom S (String). Všimnite si, že konštanta reťazca špecifikovaná v "úvodzovkách" sa považuje za char pole a nie za inštanciu triedy String.


array