{{indexmenu_n>7}} ====== 7 - Dynamicky alokovaná pole ====== * pro vyučující: [[courses:b0b99prp:internal:tutorialinstruction:07|]] ==== Procvičovaná témata ==== * malloc, calloc, free, * pointer, * 2D pole ==== Teoretická příprava ==== * [[courses:b0b36prp:tutorials:alokace_pameti_v_c]] * [[https://en.wikipedia.org/wiki/Standard_deviation|Smerodatna odchylka]] ==== Valgrind ==== Valgrind je nástroj pro analýzu paměti za běhu programu. Lze ho využít na zjištění dvou základních problémů: porovnávání neinicializovaných proměnných a nesprávná práce s dynamickou pamětí. Co je špatně na následujícím kódu? #include int main (void) { int a; printf ("%s\n", (!a) ? "nula" : "nenula"); return 0; } Vyzkoušejte spuštění ve Valgrindu a podívejte na výsledek: $ gcc -g program.c -o program $ valgrind ./program Jak se změní výstup Valgrindu pokud při definici proměnné použijeme modifikátor ''static''? Proč? V druhém příkladu se pokusíme do pole alokovaného v dynamické paměti načíst řetězec, který je delší než velikost pole. #include #include int main () { char *a = malloc(4); scanf ("%s", a); free (a); return 0; } Ověříme výstup Valgrindu: $ echo ahoj > data.in $ gcc -g program.c -o program $ valgrind ./program < data.in Jak se změní výstup Valgrindu, když nebude v kódu uvolnění paměti pomocí funkce ''free''? ==== Úkoly na cvičení ==== - Napište program, který zpracuje posloupnost reálných čísel zadaných na standardním vstupu * Posloupnost bude uložena v poli alokovaném v dynamické paměti * Velikost pole je prvním číslem na standardním vstupu * Napište funkci, která vypočte směrodatnou odchylku z prvků zadaného pole. * Společně s cvičícím si předveďte použití Valgrindu pro diagnostiku přístupů do paměti a správné alokace. * Aplikujte funkce pro výpis a výpočet směrodatné odchylky na pole získané načítací funkcí. Nezapomeňte na dealokaci pole při ukončení programu! - Upravte předchozí program tak, aby byla schopna načíst libovolnou posloupnost reálných čísel do pole ukončenou vhodnou zarážkou nebo lépe pomocí EOF, umí-li to vaše konzole. ==== Další úkoly ==== - Upravte předchozí program tak, aby bylo možné načíst od uživatele více datových řad a pro každou zvlášť spočítat směrodatnou odchylku. Jednoduše to zařídíte tak, že vytvoříte dvourozměrné pole, které ale může mít různé délky řádků. Nezapomeňte zajistit i dealoakaci celého pole! - Napište program, který seřadí načtené pole pomocí metody [[https://cs.wikipedia.org/wiki/Bublinkov%C3%A9_%C5%99azen%C3%AD|bubble sort]].