Programski jezik C

Funkcije

Ker se določene kose kode v programu želi uporabiti večkrat ter na različnih mestih in ker ne bi radi zato pisali oziroma podvajali kodo, uporabimo funkcije, s katerimi dosežemo tudi boljše razumevanje poteka programske kode.

Funkcije si lahko predstavljamo kot (pod)program, ki nekaj naredi, in katerega ponavadi kličemo iz neke druge funkcije. Funkcijo lahko v nekaterih primerih, ko to potrebujemo, kličemo tudi iz te-iste funkcije.

Za poimenovanje funkcij veljajo enaka pravila kot za poimenovanje spremenljivk. Poglejmo si primer funkcije.

int ploscina_pravokotnika(int a, int b)
{
  return a * b;
}

Ime zgornje funkcije je ploscina_pravokotnika in se nahaja pred oklepajema, ki določata tip vhodnih parametrov, katere bo funkcija sprejela. Zgornja funkcija bo sprejela dva parametra tipa int, ki bosta znotraj funkcije dostopna preko imen a in b. Beseda ali več besed (zgoraj int) pred imenom funkcije določa tip rezultata oziroma tip izhodnega podatka. Ti elementi predstavljajo glavo funkcije.

Če funkcija ne sprejme vhodnih podatkov, kot naprimer funkcija main, potem v oklepajih navedemo void.

Telo funkcije predstavljajo stavki in bloki znotraj para zavitih oklepajov, ki se bodo izvedli ob klicu funkcije.

Takoj na začetku telesa funkcije se morajo naznaniti spremenljivke, ki se bodo uporabljale v nadaljevanju. Privzeto te spremenljivke niso vidne zunaj funkcije. Izvajanje funkcije se konča s pripadajočim zavitim zaklepajem } ali s stavkom return, ki določi tudi rezultat funkcije. V zgornjem primeru funkcija vrne zmnožek dveh vrednosti, ki ju hranita spremenljivki a in b.

Če funkcija ne bo vračala rezultata, za njen tip izberemo void. Kljub temu lahko v kodi uporabljamo stavek return, ki bo predčasno zaključil funkcijo.

Klic funkcij

Sedaj, ko imamo funkcijo, si še poglejmo, kako jo kličemo. V naslednjem primeru bomo funkcijo poklicali iz druge funkcije in ji pri klicu podali dva konstantna (številska) parametra. Vrednost, ki jo bo klicujoča funkcija vrnila, bomo shranili v spremenljivko pl.

int ploscina_pravokotnika(int a, int b)
{
  return a * b;
}

int main (void)
{
  int pl;
  pl = ploscina_pravokotnika(2, 3);

  return 0;
}

Funkcija, ki se jo kliče, torej ploscina_pravokotnika, mora biti vedno nad funkcijo, ki jo kliče ali uporabi, v tem primeru nad main, saj mora prevajalnik vedeti tipe parametrov klicujoče funkcije.

Namesto številskih parametrov lahko pri klicu funkcije uporabimo tudi spremenljivke.

int stranica_a = 4;
int stranica_b = 6;

pl = ploscina_pravokotnika(stranica_a, stranica_b);

Naznanitev funkcije

Funkcija, ki jo kličemo, se lahko nahaja tudi pod klicujočo funkcijo ali pa v drugi datoteki, vendar moramo v tem primeru pred klicujočo funkcijo postaviti najavo funkcije, kar imenujemo tudi podpis funkcije. Podpis funkcije sestoji iz tipa rezultata, imena funkcije in tipov vhodnih parametrov. Za zgornjo funkcijo ploscina_pravokotnika je pripadajoči podpis podan spodaj.

int ploscina_pravokotnika(int, int);

Kot vidimo je ta zapis zelo podoben glavi funkcije, le namesto zavitih oklepajev in njenega telesa navedemo podpičje ;. Imena spremenljivk lahko navedemo ali ne. V zgornjem primeru jih ni. Prevajalnik mora namreč vedeti le tip spremenljivke.

Vidnost spremenljivk

Spremenljivke, ki jih naznanimo v telesu funkcije, se lahko uporabljajo le v stavkih funkcije oziroma tudi v funkciji, ki jo ta kliče, če ji funkcija ob klicu poda kazalec nanjo. Če si ne želimo podajati kazalcev, lahko uporabimo globalne spremenljivke, ki so shranjene na kopici, poleg tistih spremenljivk z lastnostjo static. Te spremenljivke naznanimo zunaj funkcij, ponavadi po ukazih namenjenih prevajalniku in pred našimi funkcijami.

int n;

void dodaj_ena(void)
{
  n += 1;
}

int main(void)
{
  n = 2;
  dodaj_ena();

  return 0;
}