Čtení chyb

Chyby k programování patří. Dělají je i zkušení programátoři, a to každý den. Důležité je umět je rychle najít a opravit, a s tím vám pomůžou chybové hlášky.

Překladač si před spuštěním projde celý program. Když v něm najde chybu, program vůbec nespustí, ani řádky před chybou, a ukáže červenou chybovou hlášku. Například v tomto programu chybí na řádku 4 středník:

#include <stdio.h>

int main(void) {
    printf("Ahoj!\n")
    printf("Jak se máte?\n");
    return 0;
}

Překladač Clang, který tady programy překládá, vypíše:

main.c:4:22: error: expected ';' after expression
    4 |     printf("Ahoj!\n")
      |                      ^
      |                      ;
1 error generated.

Nejdůležitější je první řádek hlášky. Čtěte ho zleva:

  • main.c je název souboru s programem, tedy toho v editoru.
  • 4 je číslo řádku s chybou. Čísla řádků vidíte v editoru vlevo.
  • 22 je číslo sloupce: kolikátý znak na řádku to je. Počítají se i čtyři mezery na začátku řádku.
  • error: říká, že jde o chybu. Za ním následuje popis v angličtině: expected ';' after expression znamená „za výrazem jsem čekal ;“, tady za printf(...).

Pod tím Clang ukáže řádek s chybou a místo označí znakem ^. Často pod něj dokonce napíše, co tam chybí, tady ;. Poslední řádek 1 error generated. říká, kolik chyb Clang našel.

Písmena s diakritikou, jako á nebo š, Clang počítá za dva znaky, takže na řádku s nimi vyjde číslo sloupce o něco větší, než kolik znaků napočítáte. Značka ^ ale ukazuje vždy na správné místo.

Trochu jinak vypadá hláška, když chybí uvozovka na konci textu:

#include <stdio.h>

int main(void) {
    printf("Ahoj!\n);
    return 0;
}
main.c:4:12: warning: missing terminating '"' character [-Winvalid-pp-token]
    4 |     printf("Ahoj!\n);
      |            ^
main.c:4:12: error: expected expression
1 warning and 1 error generated.

Řádek s warning: je varování: upozornění, že něco vypadá podezřele. Tady je dokonce užitečnější než samotná chyba. missing terminating '"' character znamená „chybí koncová uvozovka“ a znak ^ ukazuje na uvozovku, ke které chybí pár. Bez ní překladač nepozná, kde text končí, a za printf( proto nenajde nic, co by dávalo smysl: expected expression znamená „čekal jsem výraz“, tedy něco, co by šlo vypsat.

Program, který má jen varování a žádnou chybu, se spustí a tento web jeho varování neukazuje. Proto tu ta nejdůležitější varování platí jako chyby, třeba %d bez hodnoty ze cvičení Text a čísla. Poznáte je podle -Werror na konci řádku: [-Werror,-Wformat-insufficient-args].

Jedna chyba někdy způsobí několik hlášek a jindy zase zakryje jinou chybu, kterou překladač najde, až když tu první opravíte. Proto vždy opravte nejdřív první chybu a program spusťte znovu. Další hlášky často zmizí, protože byly jen jejím následkem. A naopak: po opravě se může objevit nová chyba.

Další časté chyby a jejich hlášky:

  • Překlep v printf, třeba prinft nebo Printf: call to undeclared function 'prinft'; ISO C99 and later do not support implicit function declarations. Překladač nezná funkci s tímto názvem. V poznámce pod hláškou dokonce radí, co jste nejspíš mysleli: did you mean 'printf'?
  • Chybí řádek #include <stdio.h>: hláška začíná call to undeclared library function 'printf' a poznámka pod ní rovnou říká, co udělat: include the header <stdio.h> (připojte hlavičkový soubor).
  • Chybí } na konci funkce main: expected '}' a k tomu poznámka to match this '{', která ukazuje na závorku, ke které chybí pár.

Řádky s note: jsou jen doplňující poznámky. Některé ukazují do souborů standardní knihovny, třeba stdio.h, a těch si nemusíte všímat.

Pokyny

Program v editoru má dvě chyby. Spusťte ho a přečtěte si první chybovou hlášku: na kterém řádku a sloupci je chyba a co je špatně? Chybu opravte a program spusťte znovu. Objeví se nová hláška: první chyba tu druhou zakrývala. Opravte i ji, aby program vypsal:

Turnaj v piškvorkách
Kdy: v sobotu v 10:00
Kde: ve třídě 2.B

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

6/7