Funkce (programování)

Z Multimediaexpo.cz

V programování je funkce část programu, kterou je možné opakovaně volat z různých míst kódu. Funkce může mít argumenty (též parametry) – údaje, které jí jsou předávány při volání – a návratovou hodnotu, kterou naopak vrací. Na rozdíl od funkce v matematice nemusí výsledek funkce v programu záviset jen na jejích argumentech – v průběhu svého běhu může samostatně získávat data z paměti nebo jiných vstupů a provádět i výstupní operace, takže návratová hodnota zdaleka nemusí být jejím jediným výsledkem (viz vedlejší účinek) a funkce také nemusí mít žádné formální parametry (typ. funkce vracející hodnotu stisknuté klávesy). Často nemusí funkce vracet žádnou hodnotu, potom se taková funkce může nazývat procedurou. V objektově orientovaném programování se funkce náležející nějaké třídě nazývají metodami.

Obsah

Argumenty funkce

  • formální argumenty (parametry) - udává jakého datového typu a počtu jsou jednotlivé argumenty funkce, některé programovací jazyky umožňují deklarovat funkce s proměnným počtem parametrů
  • skutečné argumenty (parametry) - jsou to skutečné argumenty (výrazy) uvedené při volání funkce

Předávání argumentů

volání hodnotou (call by value)
volající provede vyhodnocení výrazu který je zadán jako argument funkce a výslednou hodnotu předá do volané funkce
volání odkazem (call by reference)
volající předá v argumentu funkce ukazatel nebo referenci na proměnou. Funkce může obsah této proměnné nejen číst, ale i modifikovat její obsah (viz vedlejší účinek). Často se pole jako argument funkce předává pomocí volání odkazem
volání jménem (call by name)
výraz v argumentu funkce se nevyhodnocuje a předá se do funkce tak jak je. Proto se ve funkci může tento argument vyhodnocovat vícekrát. Nejčastější použití je u symbolických maker

Ukázky v programovacích jazycích C a C++

void funkce1(void) { /* nějaký kód */ }

Tato funkce nevrací hodnotu a je volána: funkce1();

int funkce2(void)
  { return 5; }

Tato funkce navrací hodnotu (číslo 5) a funkci můžeme zavolat jako část příkazu: x + funkce2()

char funkce3 (int cislo)
  { char rada[] = {'P','U','S','C','P','S','N'};
    return rada[cislo];
  }

Tato funkce konvertuje číslo mezi 0 a 6 na počáteční písmeno dne v týdnu. Ukázka: 0 → 'P', 1 → 'U', …, 6 → 'N'. Výsledek volání funkce může být přiřazen proměnné: char pismeno_dne = funkce3(cislo);.

void funkce4 (int* ukazatel_na_promennou)
  { (*ukazatel_na_promennou)++; }

Tato funkce nevrací žádnou hodnotu, ale modifikuje proměnnou, jejíž adresa je zadána v parametru funkce. Funkci lze volat: funkce4(&promenna);.

int (*funkce5(double (*F)(long b), int (*f)(void* c))) (void * v);

Tento řádek deklaruje funkci funkce5 (bez těla, jedná se o predeklaraci), která vrací ukazatel na funkci vracející integer a mající parametr typu nespecifikovaný ukazatel a má dva parametry: první je ukazatel na funkci vracející double (reálné číslo s dvojitou přesností) s parametrem typu long („dlouhé“ celé číslo), druhý je opět ukazatel na funkci, a to stejného typu jako funkce vracená, tedy vracející integer a mající parametr typu nespecifikovaný ukazatel. Podobné zápisy se v běžných programech vyskytují zřídka, protože bývají zpřehledněny pomocí typedef. Mohou se ale vyskytnout v chybové hlášce překladače nebo v automaticky generovaném zdrojovém kódu. Ekvivalentní definice pomocí typedef zní:

typedef double F1(long);
typedef int F2(void *);
F2 * funkce5(F1*,F2*);

Ukázka v PHP

function funkce1($a,$b) {
  return($b['num']-$a['num']);
}

V beztypových programovacích jazycích jako PHP je zápis funkce jednodušší: neuvádí se typy argumentů, jen názvy. Funkce předpokládá, že oba její argumenty jsou asociativní pole obsahující prvek num a vrátí rozdíl těchto prvků. Podobné funkce se často používají jako callback pro řazení, tedy předají se jako argument řadící funkci a ta je opakovaně volá na dvojice prvků řazeného pole.

Související články

Reference