Zpětná vazba k první sadě
Časté konkrétní problémy
Úkol 1
- Opakování kódu.
- Záporné dluhy.
- strcmp vs ==
Úkol 2
- Interpolation search: celočíselné vs float děleni.
Obecně: třídení by nemělo být součástí algoritmu binary/interpolation search, protože pak degraduje jeho složitost.
Úkol 3
- Kód seznamu zbytečně složitý.
- Hrozí dereference NULL ukazatele.
Úkol 4
- Fronta může přetéct.
- Hrozí dereference NULL ukazatele.
Úkol 5
- Kód seznamu zbytečně složitý.
- tree* t = malloc(sizeof(tree)); V print, depth, … je dost podezřelé (vizte B).
- Alokace uzlu v add i ve volání, ve kterém se nepřidává (t.j. alokace navic a bez free; vizte B).
- Hrozí dereference NULL ukazatele.
Obecné problémy
- Nesmyslný kód typu:
if (uzel->next == NULL)
{
printf("%d", uzel->data);ř
}
else
{
printf("%d,", uzel->data);
}
- Chybějící free (či míchání významu u vytváření ukazatele a alokace paměti).
- Nedodržené zadání (typy atp.).
- Ignorovaná varování kompilátoru (téměř vždy to značí fatální chybu).
- Běh konči chybou - typicky segmentation fault (SIGSEGV).
- Příkaz return ukončuje funkci. Nic za ním už se nevykoná (a tedy to nemá smysl psát)
- Struktury používané jen v rámci funkce, která je alokuje, nemusíte alokovat dynamicky (typicky tree wrapper okolo uzlu). Toto není chyba, pokud nezapomenete na free.
- Takováto konstrukce nevytváří kopii pole: struct debtor debts_copy[] = debts;
- Kód nelze zkompilovat.
Další komentáře
- Volte rozumné a popisné názvy proměnných, procedur atd.
- Dodržujte nějaké konvence jazyka, ve kterém píšete (vyberte si jedny a těch se držte).
- Pro kontrolu práce s pamětí používejte valgrind.
- Mnoho z vás nepochopilo algoritmus BFS, podívejte se na něj ještě jednou.
- Ukazatel a alokace jsou různé koncepty.