Parametry a argumenty

Funkce, které jste zatím napsali, dělají pokaždé přesně totéž. vypis_gratulaci vypíše vždy stejné tři řádky. Často ale chcete, aby funkce dělala skoro totéž, jen pokaždé trochu jinak: aby vypsala čáru z 5 pomlček a potom z 20. Takové hodnoty funkce dostávají pomocí parametrů:

#include <stdio.h>

void vypis_caru(int delka) {
    for (int i = 0; i < delka; i++) {
        printf("-");
    }
    printf("\n");
}

int main(void) {
    vypis_caru(5);
    vypis_caru(20);
    return 0;
}

Tento program vypíše:

-----
--------------------

V definici je int delka v závorkách parametr: proměnná, kterou funkce může používat ve svém těle. Stejně jako u jiných proměnných u něj napíšete datový typ a název, jen bez středníku. Parametr nahradil slovo void, které znamenalo, že funkce nic nedostává. Ve volání je hodnota v závorkách, 5, argument. Když funkci zavoláte, argument se uloží do parametru a pak se provede tělo funkce. Při prvním volání je v parametru delka hodnota 5, při druhém 20.

Tato dvě slova se snadno pletou, tak si zapamatujte: parametr je proměnná v definici, argument je hodnota ve volání. Argumentem může být číslo, proměnná nebo celý výraz, například vypis_caru(sirka * 2). A teď už víte, co je "Ahoj!\n" v printf("Ahoj!\n"): argument funkce printf.

Funkce může mít i více parametrů oddělených čárkami. Každý parametr má svůj datový typ, i když jsou typy stejné: int domaci, int hoste, ne int domaci, hoste. Argumenty se do parametrů dosazují podle pořadí: první argument do prvního parametru, druhý do druhého a tak dál:

#include <stdio.h>

void vypis_skore(int domaci, int hoste) {
    printf("Skóre: %d:%d\n", domaci, hoste);
}

int main(void) {
    vypis_skore(2, 1);
    vypis_skore(0, 3);
    return 0;
}

Tento program vypíše:

Skóre: 2:1
Skóre: 0:3

Jazyk C kontroluje, jestli argumenty k parametrům sedí. Každý parametr potřebuje svůj argument. Když v prvním volání napíšete jen vypis_skore(2);, program se nepřeloží:

main.c:8:18: error: too few arguments to function call, expected 2, have 1
    8 |     vypis_skore(2);
      |     ~~~~~~~~~~~  ^
main.c:3:6: note: 'vypis_skore' declared here
    3 | void vypis_skore(int domaci, int hoste) {
      |      ^           ~~~~~~~~~~~~~~~~~~~~~
1 error generated.

První řádek říká, že volání má málo argumentů (too few arguments): funkce jich očekává 2 (expected 2), ale volání má jen 1 (have 1). Řádek s note pod ním ukazuje, kde je funkce definovaná. Při příliš mnoha argumentech hláška říká too many arguments to function call.

Typ argumentu má také odpovídat parametru. Text místo čísla, například vypis_skore("dva", 1), se nepřeloží. Desetinné číslo pro parametr typu int se ale bez upozornění usekne na celé číslo: vypis_skore(2.7, 1) vypíše Skóre: 2:1. A když prohodíte dva argumenty stejného typu, překladač to vůbec nepozná: vypis_skore(1, 2) prostě vypíše jiné skóre. Pořadí argumentů si proto vždy zkontrolujte.

Teď je také vidět, proč u funkce bez parametrů píšeme (void). U void pozdrav(void) je volání pozdrav(5) chyba: too many arguments to function call, expected 0, have 1. S prázdnými závorkami, void pozdrav(), by takové volání jazyk C pustil dál. Prázdné závorky uvidíte v programech jiných lidí, ale (void) je bezpečnější.

Pokyny

Nad main napište funkci vypis_radek se dvěma parametry: znak typu char a pocet typu int. Funkce nic nevrací. Vypíše znak tolikrát, kolik je pocet, a to vše na jeden řádek: v cyklu for vypisujte jen znak (pomocí %c) a řádek ukončete až za cyklem.

V main zavolejte vypis_radek('*', 5) a potom vypis_radek('#', 3). Program vypíše ***** a ###.

Argumentem může být i proměnná. Pod obě volání napište cyklus for, ve kterém i jde od 1 do 4 a který volá vypis_radek('*', i). Při každém průchodu cyklem dostane funkce jiný argument, a tak program nakreslí trojúhelník:

*
**
***
****

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/12