Funktiot
Funktio on itsenäinen ohjelman osa, joka tekee jonkin halutun tehtävän, se voi esimerkiksi laskea jonkin laskutoimituksen. Funktioiden avulla voidaan selkeyttää koodia, sillä ne eriyttävät tietyn toiminnon omaksi kokonaisuudekseen, jota voidaan tarvittaessa kutsua.
Funktioista puhuttaessa voidaan erottaa kaksi tasoa:
- Toisaalta on olemassa valmiita kirjastofunktioita, jotka ovat kaikkien ohjelmoijien käytössä. Esim debugPrint.
- Toisaalta jokainen ohjelmoija voi kirjoittaa funktioita omaan käyttöönsä.
Funktion kirjoittaminen
Funktion täydellinen nimi koostuu kolmesta asiasta:
- paluuarvon tyypistä (pakollinen!)
- funktion nimestä (pakollinen!)
- parametreista (ei pakollisia, riippuu käyttötarkoituksesta)
funktion_paluuarvon_tyyppi funktion_nimi( param_1_tyyppi parametri_1, param_2_tyyppi parametri_2, /* loput parametrit, jos on */) { // Funktion koodi tänne }
Funktiot kannattaa kirjoittaa task main()
:in yläpuolelle.
Funktiotyypit
Funktioita voidaan tehdä erilaisia:
Esimerkki 1
Esimerkissä on toteutettu funktio AjaEteenpain()
.
void AjaEteenpain() { motor[motorB] = 50; // Asetetaan moottori B 50% eteenpäin motor[motorC] = 50; // Asetetaan moottori C 50% eteenpäin wait1Msec(1000); // Ajetaan eteenpäin 1 sekunti motor[motorB] = 0; // Pysäytetään moottori B motor[motorC] = 0; // Pysäytetään moottori C }
Esimerkin mukainen funktio ajaisi moottoreita B ja C 50% teholla eteenpäin, jonka jälkeen pysäyttäisi moottorit.
Funktion kutsuminen
Funktiota kutsutaan muodossa funktion_nimi() ja sulkujen sisään tulevat mahdolliset parametrit.
Esimerkin 1 funktion kutsuminen pääohjelmasta:
task main() // pääohjelma { AjaEteenpain(); // funktion kutsu }
Funktiota voidaan kutsua mistä tahansa ohjelmasta, myös funktiosta itsestään (kts. rekursio).
Funktion parametrit
Funktioille voidaan myös välittää tietoa kutsun yhteydessä. Tämä tapahtuu funktion parametrien välityksellä. Jos funktiolle on määritelty parametreja, ne on pakko antaa funktiota kutsuttaessa.
Esimerkki 2
// Funktiolle annetaan tieto kuinkan kauan sen tulee ajaa eteenpäin aika-parametrin avulla void AjaEteenpain(int aika) { motor[motorB] = 50; // Asetetaan moottori B 50% eteenpäin motor[motorC] = 50; // Asetetaan moottori C 50% eteenpäin wait1Msec(aika); // Ajetaan eteenpäin aika-parametrin osoittama aika motor[motorB] = 0; // Pysäytetään moottori B motor[motorC] = 0; // Pysäytetään moottori C } task main() { AjaEteenpain(500); // Ajetaan eteenpäin ½ sekuntia. }
Edellä oleva funktio ottaa parametrikseen yhden kokonaisluvun, ajan.
Esimerkki 3
void AjaEteenpain(int aika, int nopeus) { motor[motorB] = nopeus; // Asetetaan moottori B nopeus-parametrin määrän eteenpäin motor[motorC] = nopeus; // Asetetaan moottori C nopeus-parametrin määrän eteenpäin wait1Msec(aika); // Ajetaan eteenpäin aika-parametrin osoittama aika motor[motorB] = 0; // Pysäytetään moottori B motor[motorC] = 0; // Pysäytetään moottori C } task main() { AjaEteenpain(500, -25); // Annetaan parametrien arvoiksi sopivat luvut. }
Edellä oleva funktio ottaa parametreikseen kaksi kokonaislukua, ajan ja moottoreiden nopeuden.
Funktion paluuarvo
Funktio voi päätyttyään palauttaa kutsujalleen tietoa. Tieto palautetaan return
-käskyllä. Funktiossa voi olla useita return
-lauseita sopivissa kohdissa. Jokainen niistä poistuu funktiosta siinä kohdassa missä return
on. Funktion nimen edessä oleva tyyppi määrää paluuarvon tyypin ja siksi return
-lauseen perässä olevan arvon pitää olla samaa tyyppiä (joko vakio tai muuttuja).
Esimerkki 4
int SensorinArvo() { int arvo = SensorValue[S1]; return arvo; } task main() { int sensoriLukema; // Esitellään paikallinen muuttuja. Muuttuja näkyy vain tässä funktiossa! sensoriLukema = SensorinArvo() // Funktion palauttama arvo kopioidaan muuttujaan sensoriLukema }
Esimerkissä funktio SensorinArvo()
palauttaa sensorin S1
lukeman.
Esimerkki 5
int SensorinArvo(int portti) { int arvo = SensorValue[portti]; return arvo; } task main() { int sensoriLukema; // Esitellään paikallinen muuttuja. Muuttuja näkyy vain tässä funktiossa! sensoriLukema = SensorinArvo(S4) // Funktion palauttama arvo kopioidaan muuttujaan sensoriLukema }
Esimerkissä funktio SensorinArvo(int portti)
palauttaa parametrin portti määrittelemän sensorin lukeman.
Paikalliset muuttujat
Funktioilla voi olla omia paikallisia (local) muuttujia.
void funktio(int x) { int y; // ... }
x
on funktion parametri jay
funktion paikallinen muuttuja. On huomattava, että parametrit ja paikalliset muuttujat eivät näy funktion ulkopuolelle, eivätkä siten ole käytettävissä muualla kuin funktiossa itsessään.- On myös tärkeää huomata, että eri funktioissa voi olla samannimisiä muuttujia ja ne ovat toisistaan täysin riippumattomia.