*** Da ponovimo :

Kada se definiše neka funkcija, onda to obično izgleda kao :

tip_koji_daje ime_funkcije (lista_parametara)  telo_funkcije

Tip vrednosti funkcije je tip_koji_daje. Za funkcije koje ne daju neku vrednost već samo stvaraju bočne efekte, kao tip_koji_daje treba koristiti službenu reč void.

Lista_parametara predstavlja parametre funkcije pomoću kojih se vrši unošenje početnih podataka u funkciju. Vrednost funkcije se izračunava na osnovu tih početnih podataka. - Parametri funkcije nisu stvarni podaci. Oni samo formalno predstavljaju podatke koji će se navesti prilikom poziva (korišćenja) funkcije i na osnovu čijih vrednosti će se izračunati vrednost funkcije. Ti podaci se nazivaju i argumenti funkcije.

Telo_funkcije predstavlja sadržaj funkcije koja se definiše. Ona je po formi blok, odnosno niz naredbi unutar zagrada {}. Svaki blok, pa i telo funkcije, može na početku da sadrži deklaracije promenljivih koje će se koristiti, a iza njih neke naredbe. Promenljive koje su deklarisane na početku funkcije su lokalne za funkciju, što znači da postoje i mogu da se koriste samo unutar funkcije. One se ponovo stvaraju pri svakom pozivanju funkcije, a uništavaju pri napuštanju funkcije. - Oblast gde se vidi neka promenljiva (doseg identifikatora) se proteže samo do kraja bloka u kojem je definisana. U slučaju kada je neka promenljiva definisana na početku funkcije, ona se vidi i koristi samo do kraja te funkcije. To znači da se isto ime može koristiti u više funkcija. U svakoj od tih funkcija će to biti nezavisni podaci.

Znači:

Šta god da se definiše na početku tela funkcije lokalno je za tu funkciju i može da se koristi samo unutar te funkcije. To nije pristupačno drugim funkcijama. (Dozvoljena je upotreba promenljivih sa istim imenima u različitim funkcijama.)

A sada nešto novo :

Pored lokalnih promenljivih, mogu da postoje i promenljive koje su dostupne većem broju funkcija. One se nazivaju globalne promenljive, a definišu se naredbama koje se pišu izvan definicija bilo koje funkcije.

Oblast vidljivosti globalne promenljive je od mesta njihove deklaracije do kraja teksta programa. To znači da se mogu koristiti u svim funkcijama koje se nalaze iza tog mesta.

Pošto su globalne promenljive dostupne iz svih funkcija koje se nalaze iza njihove definicije, one se mogu koristiti i za razmenu podataka između funkcija (dosad smo za to koristili samo parametre funkcija). Menjanje vrednosti globalnih promenljivih iz funkcija jeste novi vid bočnih efekata funkcija.

Primer u kojem se ilustruje kako se stvaraju bočni efekti funkcije pomoću globalnih promenljivih možemo uzeti kvadrat:

#include <stdio.h>
float a, P, O; /*definicija globalnih promenljivih */
void kvadrat(void) /* funkcija za računanje */
{ /* obima i površine kvadrata */
O = 4 * a;
P = a * a;
}
int main(void) /* glavni program */
{
printf("Unesite duzinu stranice: ");
scanf("%f", &a);
kvadrat(); /* poziv funkcije posebnom naredbom */
printf("\n Obim: %f", O);
printf("\n Povrsina: %f", P);
return 0;
}

Znači:Na početku su definisane globalne promenljive za razmenu podataka između funkcije kvadrat i glavnog programa. Pošto se svi podaci razmenjuju pomoću globalnih promenljivih, funkcija kvadrat nema ni jedan parametar. U glavnom programu nije definisana ni jedna promenljiva, pošto i on koristi globalne promenljive.

Kada se pokrene glavni program, pročitanu dužinu stranice postavlja u globalnu promenljivu a, odakle funkcija kvadrat može neposredno da je dohvati. Izračunati obim i površinu ta ista funkcija postavlja u globalne promenljive P i O, odakle glavni program može da ih neposredno dohvati radi ispisivanja.

Globalni podaci se stvaraju na samom početku izvršavanja programa (pre pozivanja finkcije main). Zbog toga, pri navođenju početnih vrednosti mogu da se koriste samo konstante. Ako se ne navedu početne vrednosti, globalni podaci imaju nulte početne vrednosti.

Globalni podaci postoje svo vreme izvršavanja programa.

Napomena: funkcije se obavezno definišu izvan drugih funkcija, što znači da su globalne za ceo program. To omogućava da se funkcije međusobno pozivaju. Svaka funkcija može da pozove bilo koju funkciju koja je definisana pre nje, ili za koju je bar naveden prototip pre nje.

Last modified: Tuesday, 20 November 2018, 10:34 PM