====== 8 - 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í.
Instalaci Valgrindu na Windows doporučujeme ve spojení s Windows Linux Subsystem, kde návod najdete v sekci návody [[courses:b0b99prpa:tutorials:valgrind|Linux konzole pro Windows 10]] s propojením VS Code pomocí rozšíření [[https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl|Remote - WSL]]
[[https://docs.microsoft.com/en-us/windows/wsl/install-win10|Instalace WSL pres powershell]]
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]].