DU pro TEST2 - procvičení práce s dynamickou pamětí.
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.
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ů.
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.
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.
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.
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.
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.
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.:
připravte si projekt jehož součástí bude check.cpp a check.h
všechny funkce musí vyřešit následující (situace s nevhodnými
vstupními daty, testy nevhodného použití nebo "napadení"
):
nepracovat s ukazatelem, který je NULL
nealokovat novou
paměť pro ukazatel, který není NULL
alokovat paměť pouze pro
hodnoty větší než nula
po odalokaci nastavit ukazatel na
NULL
funkci zkuste zavolat několikrát po sobě se stejnými
parametry (musí korektně reagovat - znovu nealokovat, znovu
neodalokovat …)