11. Prosledimo nasoj funkciji parametar.

Kada pisemo programski kod, trebalo bi da se pridrzavamo nekih principa koje ce ga uciniti preglednim, a njegov eventualni dalji razvoj i odrzavanje laksim. Funkcije predstavljaju neku vrstu modula u kojima se izvrsavaju jasno definisani zadatci. Mada smo se vec na proslom casu upoznali sa funkcijom i njenim izgledom i nacinom pozivanja, sada cemo malo prosiriti nase znanje o funkcijama. 

Nasa funkcija je izgledala ovako:

Function OdaberiPoruku ()
Var
int Sat


Let Sat = StringToInt (SysGetTime ("HH"))


If Sat < 18 Then
Let Poruka = "Dobar dan"
Else
Let Poruka = "Dobro vece"
EndIf

EndFunction


Funkcija pocinje zaglavljem, odnosno pocetnim redom :
Function OdaberiPoruku ()
a zavrsava se zavrsnim redom
EndFunction


Programska rec "Function" je obavezna i oznacava da u tom redu pocinje funkcija. Videli smo da na ovom mestu u slucaju skripte stoji rec "script". Ime funkcije je takodje obavezni deo zaglavlja i za njega vaze ista pravila kao i pri davanju imena skriptama. Par zagrada koji se obavezno navodi iza imena funkcije, sluzi da se u njima navedu parametri, ukoliko ih funkcija ima. Nasa funkcija do sada nije imala parametre, ali sada cemo pogledati  kako bi izgledala ukoliko bi ih imala.
Uradite sledece:
1. Postavite kursor negde na tekst nase funkcije i pritisnite "control+D" da se otvori "Script information", prozor sa dokumentacijom za nasu funkciju.
2. Pritisnite "control+tab" da dodjete na karticu "Parameters".
3. Pomerite se jednom tabom da dodjete na "New Parameter", i tu upisite ime parametra Sat.
4. Pomerite se nekoliko puta tabom da dodjete na "Available types", i tu strelicama na dole ili gore, odaberite "Int".
5. Pomerite se tabom na "Add" dugme i potvrdite ga razmaknicom.
6. Sada ste ponovo na polju za dodavanje novih parametara, ali nam vise nisu potrebni i zato se prosetajte tabom do OK dugmeta i potvrdite izmene. 

Sta se desilo sa nasom naslovnom linijom funkcije?

Void Function OdaberiPoruku (int Sat)

Parametar koji smo dodelili nasoj funkciji u dijaloskom prozoru "Parameters", pojavio se u zagradi. Uocite da je naveden na isti nacin kako se to radi pri standardnom deklarisanju promenljivih nakon reci Var. I zaista, iz ugla njegove upotrebljivosti u telu same funkcije, ovaj parametar mozemo posmatrati kao da je lokalna promenljiva deklarisana u samom telu funkcije. Medjutim, razlika postoji.
Kada funkcija dobija parametar, onda on vec ima odredjenu vrednost koju donosi sa sobom u funkciju. Kada deklarisemo lokalnu promenljivu u telu funkcije iza reci Var, ona ima vrednost praznog stringa, ako je string, ili 0 ako je celobrojna vrednost, ("integer"). 
Posto sada nasa funkcija dobija parametar sat pri njenom pozivu, izbrisite iz tela funkcije sledece redove:

Var
int Sat


Let Sat = StringToInt (SysGetTime ("HH"))


tako da funkcija izgleda ovako:

Void Function OdaberiPoruku (int Sat)

If Sat < 18 Then
Let Poruka = "Dobar dan"
Else
Let Poruka = "Dobro vece"
EndIf

EndFunction


Setite se da nasu funkciju koja sada ima jedan celobrojni parametar jos uvek pozivamo iz nase skripte kao funkciju bez parametra, kakva je do sada bila. Zato idemo u skriptu pozdravnaPoruka i tamo red:

OdaberiPoruku ()

Ispravimo tako sto cemo u zagrade staviti konkretnu vrednost koju prosledjujemo nasoj funkciji. Neka to bude recimo broj 20, pa ce red za poziv funkcije glasiti: 

OdaberiPoruku (20)

Acitava skripta ce biti:

Script PozdravnaPoruka ()

OdaberiPoruku (20)
SayString (Poruka)

EndScript


Sada nas ceo skript fajl treba da izgleda ovako:

;pocetak skript fajla

Globals
string Poruka


Script PozdravnaPoruka ()

OdaberiPoruku (20)
SayString (Poruka)

EndScript

Void Function OdaberiPoruku (int Sat)

If Sat < 18 Then
Let Poruka = "Dobar dan"
Else
Let Poruka = "Dobro vece"
EndIf

EndFunction



Konacno mozemo kompilirati i isprobati nasu skriptu. Sta izgovara? Upisite u poziv funkcije neki broj manji od 18. Da li je nasa funkcija pravilno odabrala poruku?

Uocite da smo broj sati prosledili direktnim upisivanjem vrednosti za parametar u zagrade, pri pozivu funkcije. Setite se da smo u jednoj drugoj, Jaws-ovoj funkciji "SayString" a koja ima string parametar, ovaj parametar prvo upisivali direktno kao "Pozdrav svima!", a potom smo u zagrade upisivali promenljivu koju smo zvali Poruka i kojoj smo prethodno dodelili vrednost. Tako i sa nasom funkcijom kojoj smo direktno upisali vrednost 20, mozemo da postupimo ukoliko u telu skripte prethodno smestimo aktuelno vreme u neku lokalnu promenljivu. Da bi se uocilo da promenljiva iz skripte i ona iz funkcije nisu jedna te ista promenljiva, dacemo u skripti novoj promenljivoj ime "Cas", ali je vazno znati da bi i promenljiva sa imenom "Sat" potpuno jednako izvrsila svoj posao. 

Upisimo sada na pocetku skripte redove slicne onima koje smo izbrisali iz funkcije:

Var
int Cas


Let Cas = StringToInt (SysGetTime ("HH"))


A takodje i u redu koji poziva funkciju zamenimo broj 20, nasom novom promenljivom Cas.

Sada skripta treba da izgleda ovako:

Script PozdravnaPoruka ()
Var
int Cas


Let Cas = StringToInt (SysGetTime ("HH"))

OdaberiPoruku (Cas)
SayString (Poruka)

EndScript
 

Kompilirajte skript fajl i isprobajte skriptu. Funkcija ponovo bira poruku u skladu sa aktuelnim vremenom. Pokusacemo ovo zongliranje sa promenljivama i njihovim vrednostima da objasnimo detaljnije, jer je veoma vazno da se stekne prava slika o tome sta se zaista desava kada pozovemo nasu skriptu.
Deklarise se celobrojna promenljiva Cas.
Smesta se u promenljivu Cas, broj koji predstavlja aktuelni sat.
Poziva se funkcija OdaberiPoruku, a kao parametar se prosledjuje vrednost koja se nalazi u promenljivoj Cas.
Pri izvrsenju same funkcije, prosledjena celobrojna vrednost, dodeljuje se njenom parametru iz zagrada, Sat.
U zavisnosti od uslova u kojima je upotrebljena vrednost parametra Sat, dodeljuje se odgovarajuca vrednost globalnoj promenljivoj Poruka.
Nakon povratka iz funkcije, nailazimo na sledeci red u skripti koji izgovara string koji je sacuvan u globalnoj promenljivoj Poruka. 

Mozda vam je vec pomalo muka od sve ove zavrzlame, ali to je prirodna reakcija na jednu ovako apstraktnu materiju na koju se jos niste navikli. Uskoro ce vam sve ovo biti tako prirodno kao kad okrenete odredjeni telefonski broj, i ocekujete da se u slusalici javi glas odredjene osobe. Broj koji ste okrenuli, slican je parametru pri pozivu funkcije. Telefonska centrala je u ulozi funkcije. Sve dotle dok joj prosledjujemo ispravan parametar, ona ce izvrsavati svoj posao. Pri tome nas kao i kod telefoniranja, ne interesuje unutrasnja slozenost centrale, mi hocemo samo da nas ona spoji u skladu sa okrenutim brojem. Tako je i sa funkcijama. Ako znamo cemu su namenjene, i prosledimo im parametar, ili parametre koji su im potrebni, ocekujemo da one izvrsavaju zadatak za koji su namenjene.
U naslovnom redu nase funkcije, pojavila se jos jedna nepoznata rec "Void". Rec koja se nalazi na ovom mestu oznacava tip povratne vrednosti funkcije, ali o tome na sledecem casu. "Lekcija 12."

 "Skok na sadrzaj "