Language Switcher Fallback

Muutuja tüübid ja massiivid

Vaata https://www.arduino.cc/en/Reference/HomePage Variables -> Data types

Muutuja tüüp määrab ära, mis sorti väärtust saab sellesse muutujasse salvestada. Muutuja tüüp kirjutatakse muutuja deklareerimisel, nt:
int i;
Siiamaani oleme enamiku näiteid teinud int tüüpi muutujatega. Int võtab mälus 2 baidi jagu ruumi ja mahutab täisarvulisi (integer) väärtusi vahemikus -32 768 kuni 32 767. Sellest vahemikust väljaspool või komakohaga arvu int tüüpi muutujasse salvestada ei õnnestu.

4 baidi suurune täisarvuline muutuja on long, mis mahutab väärtusi -2 147 483 648 kuni 2 147 483 647.

Olemas on ka unsigned int ja unsigned long, mis salvestavad ainult positiivseid täisarve ehk vastavalt vahemikkudes: unsigned int 0 kuni 65 535 ja unsigned long 0 kuni 4 294 967 295.

Tegelikult muutujate suurus mälus ja seega salvestatava väärtuse vahemik varieerub mõnede Arduino kontrollerite vahel (C-keel ei esita piisavalt ühtseid nõudeid), aga siin räägitu kehtib enamlevinud boardidele.

Komakohaga muutujate jaoks on kaks tüüpi float ja double, aga enamiku Arduino kontrollerite puhul on nende maht ühesugune: 4 baiti ning täpsus väljendatud -3.4028235E+38 3.4028235E+38

Oluline meelde jätta arvuliste muutujate kohta:

  • Kui muutuja väärtus ei tule selline, nagu sa kavatsesid, kontrolli, kas muutuja on sellise tüübiga, mis võimaldab üldse soovitud väärtust salvestada. See kehtib nii arvu suuruse, kui ka komakoha suhtes. Komakohaga arvutuste jaoks deklareeri osalevad muutujad float tüüpi.

 

Boolean tüüpi muutuja salvestab binaarse väärtuse: true või false. Kuna see salvestatakse kujul 1 või null, siis on samaväärsed:

boolean myBool = true;
boolean myBool = 1;

Boolean muutujaid saab kasutada tingimuslausetes lühikeselt kirjutades:
if (myBool) , mis on samaväärne if (myBool == true)

Boolean väärtusi saab "pöörata" loogilise eituse tehtega:

boolean myBool = true;
byBool = !myBool;

annab tulemuseks et myBool on nüüd false.

Ning kuna keywordid HIGH ja LOW samuti tähendavad 1 ja 0, siis on ka need kasutatavad sarnaselt boolean muutujatele, näiteks:
if (digitalRead(2)) annab sama tulemuse, mis if (digitalRead(2) == HIGH) või if (digitalRead(2) == 1)

Ja HIGH ja LOW saab samuti pöörata loogilise eitusega:

ledState = LOW;
void loop() {
  digitalWrite(13, ledState);
  delay(1000);
  ledState = !ledState;
}

- tulemuseks on sekundi tagant sisse ja välja lülitumine.

 

Array ehk massiiv on ühise nime alla koondatud üht-sama tüüpi muutujate kogum. Massiivi deklareerimiseks on mitu võimalust, peamised neist:

int myArray1[4]; //tekitati 4 kohta int tüüpi muutuja salvestamiseks
float myArray[] = {0.5, 0.6}; //tekitati 2 kohta float tüüpi muutujate salvestamiseks ja sinna salvestati 0.5 ja 0.6

Nurksulud näitavad, et tegemist on massiiviga. Deklareerimisel arv nurksulgudes näitab, mitu "kohta" ehk muutujat massiivi sisse luuakse. Arvu võib (aga ei pea) ära jätta, kui väärtused omistatakse deklareerimisel ja seda saab teha loogelistes sulgudes komadega eraldatuna.

Massiivis salvestatud muutujate kasutamiseks ja neile uue väärtuse omistamiseks viidatakse neile masiivi nime ja indeksiga nurksulgudes. Indeksid algavad nullist.

int myVar = myArray[0] + myArray[3];

Massiivi pikkust hiljem muuta ei saa ja selle deklareerimisel ei saa pikkusena kasutada muutujat, aga saab kasutada konstanti.

Nullist algavad indeksid tähendavad, et viimane indeks on ühe võrra väiksem masiivi pikkusest. See tähendab, et for loopis saab kasutata indeksi jaoks loendajat 0-st kuni < massiivi pikkus:

const int arrayLength = 4;
float myArray[arrayLength];
...
for (int i=0; i<arrayLength; i++) {
  myArray[i] = 42; // kõik massiivi elemendid käiakse läbi ja omistatakse igaühele väärtuseks 42
}

 

Veel on olemas char tüüpi muutujad, mis salvestavad 1 baidina ASCII märke. Tähemärk pannakse ühekordsete jutumärkide vahele. Igale tähemärgile vastab mingi arv -127-st kuni 126 vahemikust.
char myChar = 'a';

Sõnade ehk stringide salvestamiseks saab kasutada massiivi char muutujatest, mille deklareerimiseks on jällegi mitu viisi, lihtsaim:
char myWord[] = "EKA";
Sõna pannakse kahekordsete jutumärkide vahele, erinevalt üksikust char-ist, millel käisid ühekordsed jutumärgid. Aga selliselt defineeritud char array tegelik pikkus ei ole 3 vaid 4 märki, sest sõnadel on null-termination - massiivi elemendid on 'E', 'K', 'A', '/0'.
Kus sellist char array-d või sõnade muutujasse salvestamist Arduino kontekstis kasutada, mina head näidet tuua ei oska. Aga teadmiseks, et lisaks char arrayle on olemas veel teine asi - String objekt, mis võimaldab tähemärkidega mõningaid trikke teha. https://www.arduino.cc/en/Reference/StringObject Kui õpite mõnd rohkem tekstiga tegelevat programeerimist, kui Arduino seda on, siis seal tuleb selliste asjadega tegemist.

 

Muutuja tüüpe on mõned veel, aga põhilise ja enamvajaliku katavad int, long, unsigned int, unsigned long, float, boolean ja char massiiv ära.

Massiividele ehk arraydele leiab programmeerimises tihti rakendust.

Järgmise teemaga haakuvalt on olemas veel üks eriline muutuja tüüp - void - mida saab kasutada ainult funktsiooni return type'i tähistamiseks.