Novinka:Učte se se mnou zas jednou C (5) - Funkce
(Kategorie: Jak na to)
Napsal Kosta
07.12.2013 00:00

Dnes se konečně dostáváme k funkcím, nepostradatelné součásti všech strukturovaných jazyků, a tedy i jazyka C. Nejprve se podíváme jak se funkce definují.


Definice funkce
návratový_typ identifikátor_funkce (seznam definicí formálních parametrů){ lokální deklarace a definice;
 
  příkazy;
}

Definice funkce začíná tzv. hlavičkou funkce, což je v našem vzorovém příkladu první řádek. Návratový_typ určuje jakého typu bude hodnota, kterou bude funkce vracet. Jako další po identifikátoru typu píšeme identifikátor funkce následovaný seznamem definicí formálních parametrů. Formální parametry jsou pak proměnné nadefinované v tomto seznamu. Ty se definují stejně jako normální proměnné, jen s tím rozdílem, že nelze zkrátit zápis více proměnných stejného typu oddělením jednotlivých identifikátorů čárkou, jak ukazuje následující příklad:

int secti (int a,b)         //nelze
int secti (int a, int b)    //správný zápis

Po uvedení hlavičky funkce ještě následuje tělo funkce, které je tvořeno blokem. Jak už víme, na začátku bloku mohou být uvedeny lokální deklarace a definice, po kterých následují příkazy. Ty obvykle pracují s předanými parametry. Provádění funkce je ukončeno po vykonání posledního příkazu těla funkce, ale v takovém případě není možné odhadnout, jakou hodnotu funkce vrátí. Proto se používá příkaz return.

Příkaz return
return výraz1;

Tento příkaz způsobí okamžité opuštění funkce, ve které je použit. Hodnota nepovinného výrazu1 je pak návratovou hodnotou funkce. Pokud výraz1 neuvedeme, bude návratová hodnota předem neurčitelná. Pak bychom ale neměli tuto hodnotu nikde používat.

int secti (int a, int b){
  return a+b;
}

V příkladu je nadefinována funkce, která vrací součet dvou čísel. Typ její návratové hodnoty je určen jako int, stejně jako typy obou parametrů funkce. Po předání řízení funkci se hned začne vykonávat příkaz return, který funkci ihned ukončí a jako výsledek po jejím volání vrátí součet hodnot předaných parametrů.

Deklarace funkce
Deklarace funkce je vlastně způsob jak dát překladači všechny potřebné údaje o funkci, aniž bychom ji museli celou definovat. Předtím, než funkci zavoláme, měla by být vždy předem definována, nebo deklarována. To proto, aby překladač znal všechny formální parametry, a tak mohl vytvořit správný kód. Pokud funkci nebudeme ještě před jejím voláním deklarovat ani definovat, bude překladač odhadovat formální parametry podle typu skutečných parametrů (parametry předané funkci při jejím volání), které ale nemusí odpovídat typu parametrů formálních. Výsledkem by pak byl nesprávně sestavený kód. Pokud ale z nějakého důvodu není funkce definována před svým použitím, měla by být alespoň deklarována. Deklarace funkce vypadá takhle:

návratový_typ identifikátor_funkce (seznam definicí formálních parametrů);

Je to vlastně celá hlavička definice, která je ale zakončená středníkem.

int secti (int a, int b); // deklarace výše definované funkce.

Volání funkce
identifikátor_funkce (seznam parametrů)

Jednotlivé výrazy v seznamu parametrů jsou odděleny čárkou. Samotné parametry jsou pak výrazy, které jsou před předáním řízení funkci vyhodnoceny a jejich výsledné hodnoty jsou funkci předány. I když funkce nemá žádné skutečné parametry, závorky je nutné uvést vždy. Počet skutečných parametrů musí být vždy stejný nebo větší než počet parametrů formálních.

Samotné volání funkce je chápáno jako výraz a to určuje i místo jeho použití (např. operand některého operátoru, ve výrazovém příkazu, jako skutečný parametr (jiné funkce). Při volání funkce je provedeno několik kroků. Nejdříve je uložena adresa instrukce, na kterou se skočí po skončení provádění funkce. Pak se alokuje paměť pro formální parametry funkce, do kterých se následně zkopírují hodnoty parametrů skutečných. Formální parametry jsou vlastně lokální proměnné, a tedy existují pouze po dobu vykonávání funkce a jsou viditelné pouze z těla funkce. Když vykonávání funkce skončí, je paměť vyhrazená pro tyto proměnné uvolněna a jako výsledek volání funkce se použije její návratová hodnota (většinou tedy hodnota výrazu za příkazem return). Uvedený způsob předávání parametrů se nazývá předávání hodnotou a znamená, že hodnoty skutečných parametrů jsou pouze zkopírovány do formálních parametrů. Ve funkci se pak pracuje pouze s těmito kopiemi. Předávání parametrů odkazem je v C realizováno pomocí ukazatelů, ale o těch až někdy jindy.

a = secti(3,5); //do proměnné a se uloží výsledek po volání funkce secti(3,5)



Tato novinka je z -MCU-mikroelektronika
( http://mcu.cz/news.php?extend.3475 )