Index mimo pole
Co se stane, když použijete index, na kterém žádný prvek není, třeba index 5 v poli s pěti prvky? Záleží na tom, jestli je index číslo napsané přímo v kódu, nebo proměnná.
Když je index číslo, překladač chybu uvidí a program nepůjde přeložit:
#include <stdio.h>
int main(void) {
int body[5] = {80, 92, 75, 60, 88};
printf("%d\n", body[5]);
return 0;
}main.c:5:20: error: array index 5 is past the end of the array (that has type 'int[5]') [-Werror,-Warray-bounds]
5 | printf("%d\n", body[5]);
| ^ ~
main.c:4:5: note: array 'body' declared here
4 | int body[5] = {80, 92, 75, 60, 88};
| ^
1 error generated.Hláška říká, že index 5 je za koncem pole (past the end of the array), jehož datový typ je int[5], tedy pole pěti hodnot typu int. Řádky pod ní, které začínají note:, ukazují, kde bylo pole vytvořeno. Chybou je i záporný index: u body[-1] hláška říká, že index -1 je před začátkem pole (before the beginning of the array).
Když je index proměnná, překladač ho nekontroluje, protože proměnná dostává své hodnoty až za běhu programu. Přesně to se stane, když cyklus udělá o krok víc, protože má v podmínce <= místo <:
#include <stdio.h>
int main(void) {
int body[5] = {80, 92, 75, 60, 88};
for (int i = 0; i <= 5; i++) {
printf("%d\n", body[i]);
}
printf("Hotovo\n");
return 0;
}80
92
75
60
88
RuntimeError: unreachableProgram vypíše všech pět prvků. V šestém průchodu cyklem má i hodnotu 5 a u body[5] se program zastaví s červenou chybou RuntimeError: unreachable. Text Hotovo se už nevypíše. Hláška neříká, co se pokazilo, ale v této lekci znamená index mimo pole. Podle posledního vypsaného řádku poznáte, kam až program došel.
Totéž se stane, když je počet v cyklu větší než pole, třeba const int POCET = 6; u pole s pěti prvky.
Proč je to tak důležité? Samotný jazyk C indexy vůbec nekontroluje. Běžný program v C na vašem počítači by přečetl, co v paměti leží za koncem pole, třeba jinou proměnnou, a pokračoval by se špatnou hodnotou. Zápisem do body[5] by mohl dokonce přepsat jinou proměnnou. Takový program může na první pohled fungovat, a přitom dávat špatné výsledky. Chyba se v něm pak hledá velmi těžko. Tady se program u takového indexu zastaví, abyste chybu hned viděli. Nejlepší ochranou ale je počítat indexy správně: první prvek má index 0, poslední velikost − 1 a cyklus přes pole má v podmínce i < POCET.
Jak psát:
Pokyny
Program má vypsat časy čtyř kol. Spusťte ho: vypíše tři kola a zastaví se s chybou RuntimeError: unreachable. V posledním průchodu cyklem má i hodnotu 4 a kola[4] je za koncem pole. Opravte podmínku cyklu tak, aby cyklus skončil dřív, než i dosáhne 4. Program pak na konci vypíše V cíli.
Teď program doběhne až do konce, ale chybí první kolo: u Kolo 1 je 58, tedy čas druhého kola. Upravte cyklus tak, aby začínal indexem 0, a číslo kola vypisujte jako i + 1. Výpis pak bude:
Kolo 1: 62 s
Kolo 2: 58 s
Kolo 3: 60 s
Kolo 4: 57 s
V cíliZačněte programovat zdarma
5/12