DU pro TEST2 - procvičení práce s dynamickou pamětí.







  1. Založte projekt. V projektu vytvořte zdrojové soubory: dumain.c pro funkci main, dufunkce.c a dufunkce.h pro funkce a jejich hlavičkový soubor. Hlavičkový soubor standardně ošetřete a vložte do .c zdrojových souborů. K projektu přidejte soubory knihovny check.cpp a check.h. Soubor check.h vložte do všech zdrojových souborů jako poslední vkládaný soubor.

  2. Napište funkci PouzeText, která z C řetězce vypustí všechny netisknutelné znaky a uloží je do nového C řetězce, který naalokuje. Nový řetězec vrátí pomocí stejného parametru, kterým byl předán vstupní řetězec (tj. vymění nový řetězec za původní).
    Funkce PouzeText bude mít jeden parametr typu char **, kterým dostane odkaz na původní řetězec a vrátí odkaz na řetězec upravený.
    Funkce tedy provede kontrolu vstupního parametru. Pokud bude předaný ukazatel ukazovat na neplatnou adresu (tj. bude obsahovat NULL) načtení se neprovede a funkce vrátí chybový kód -1. Pokud bude ukazatel platný, ale místo, na které ukazuje, obsahuje NULL (tj. neobsahuje alokovanou paměť s daty) funce se neprovede a vrátí se chybový kód -2.
    Funkce vrátí v případě úspěchu hodnotu počtu znaků v novém řetězci.
    Funkce zjistí počet tisknutelných znaků v řetězci.
    Funkce naalokuje (přesně) paměť pro výstupní řetězec a ukončovací znak.
    Funkce překopíruje tisknutelné znaky z původního do nového řetězce.
    Funkce odalokuje (pokud je to potřeba) původní řetězec.
    Funkce předá nový řetězec (uloží ho pomocí vstupního parametru).
    Funkce se ukončí s návratovou hodnotou značící počet znaků.

  3. Napište funkci GenerujText, vygeneruje řetězec s náhodnými znaky o dané maximální délce.
    Funkce bude mít jako parametr hodnotu maximálního počtu znaků v generovaném řetězci.
    Funkce vrátí vygenerovaný řetězec pomocí návratové hodnoty. V případě chyby vrátí NULL.
    Pomocí funkce rand pro náhodná čísla vygenerujte číslo v rozsahu 1 až maximální délka (daná vstupním parametrem). Naalokujte paměť pro řetězec, ve kterém bude tento počet znaků (+ukončovací znak).
    Vytvořené pole vyplňte náhodnými hodnotami od 1 do 127 a na konec dejte ukončovací znak.
    Pomocí funkce PouzeText vypusťte z vygenerovaného řetězce netisknutelné znaky.
    Vygenerované pole vraťte v případě úspěchu, jinak vraťte chybovou hodnotu.
    Pozn. Pro účely ladění zvolte jednodušší hodnoty pro ladění. Například pole deseti znaků, které naplníte ASCII hodnotami od 0x1B do 0x24.

  4. Ve funkci main vytvořte pole ukazatelů na N řetězců a naplňte ho pomocí funkce GenerujText. Proměnnou N nastavte pomocí define (například na hodnotu 10).
    Řetězce vytiskněte.
    Zajistěte aby byly řetězce správně odalokovány.

  5. Nadefinujte strukturu TPole obsahující ukazatel na data typu int v proměnné iData a proměnnou typu int pro délku pole s názvem iDelka.

  6. Napište funkci Preved, která převede C řetězec na pole int obsahující (ASCII) hodnoty původního řetězce (bez konečného znaku). Pole bude realizováno pomocí struktury TPole.
    Funkce bude mít jako vstupní parametr řetězec a výsledné TPole vrátí pomocí návratové hodnoty funkce.
    Zjistěte délku řetězce. Do struktury naalokujte pole int o stejné délce jako řetězec a zapište do něj ASCII hodnoty znaků z řetězce. Nastavte proměnnou iDelka struktury na delku alokovaného pole.
    V případě neúspěchu vraťte strukturu s hodnotami {NULL, -1} jinak vraťte strukturu s polem.

  7. Napište funkci Pridej, která bude mít dva parametry typu TPole a provede přidání pole ve druhém parametru za hodnoty pole v prvním parametru.
    Funkce bude mít dva parametry – první parametr bude předávat pole (pomocí struct TPole), ke kterému se připojí druhé pole (a to i v případě, že toto první pole bude prázdné). Druhý parametr (TPole) bude obsahovat data, která se připojí k datům prvního parametru.
    Určete, zda parametry budou typu TPole, TPole* nebo TPole **. Realizujte pomocí prvního typu (v předchozím pořadí), kterým je možné předání daného parametru realizovat.
    V případě úspěchu vraťte návratovou hodnotou délku nového pole, jinak hodnotu -1.
    Ve funkci správně odalokujte paměť je-li to třeba.

  8. Ve funkci main vytvořte prázdnou strukturu TPole.
    Postupně konvertujte řetězce vytvořetné v bodě 4 pomcí funkce Prevod, a do připravené proměnné typu TPole je postupně přidávejte pomocí funkce Pridej (volání vložte za tisk, před odalokování).
    Zajistěte správné uvolnění paměti naalokované v tomto bodě řešení.



Pozn.: