Procvičení neobjektových vlastností jazyka C++



Pro lepší kontrolu manipulace s pamětí použijte knihovnu Checker .
Funkce pro omezení počtu alokací – viz checker.h.



Práce se složeným datovým typem - struct

1) Nadefinujte strukturu TVector, která bude obsahovat proměnné:
- iData pro uložení dynamického pole (tj. pole s proměnnou délkou) typu int.
- iSize pro uložení naalokované délky,
- iLen, ve které bude uložena hodnota aktuálně využitých prvků (od počátku bez mezer).

2) Ve funkci main vytvořte proměnnou vec typu TVector (proměnnou, ne ukazatel). Inicializujte její prvky na "nulové" hodnoty.

Alokace paměti pomocí new, mechanizmus výjimek

3) Naalokujte v proměnné vec do iData pole o délce 10 prvků (int – viz bod 1). Alokaci proveďte pomocí operátoru new.
Pro zjištění úspěšnosti alokace využijte mechanizmus výjimek. (Pro ověření zkuste naalokovat "větší" množství paměti - tak aby se objevila standardní výjimka).
V případě, že při alokaci došlo k chybě (tj. v případě výjimky) vypište chybové hlášení a program ukončete.
Chybové hlášení vytiskněte pomocí mechanizmů c++ (proměnná cout, endl, prostor std, knihovna iostream).


Odalokování paměti pomocí delete

4) Před koncem funkce main korektně ukončete "život" vytvořených proměnných typu TVector (odalokujte paměť pomocí operátoru delete, nebo delete[] (?).
Po odalokaci "vynulujte" proměnné struktury (signalizující, že proměnná nemá platná data). V tomto případě to není nutné, ale pokud by se v budoucnu přidával kód je dobré vědět, že proměnná neobsahuje platná data).


Práce se strukturou

5) Po inicializaci proměnné vec naplňte pvky v poli iData hodnotami indexů (tj. 0,1...9). Nastavte zbylé proměnné struktury tak, aby odpovídaly realitě. Funkci zavolejte a ověřte její činnost.

Struktura jako parametr při volání funkce

6) Alokaci pole (tj inicializaci proměnných struktury hodnotami) přesuňte do funkce AllocVector(TVector *uk,int delka).

Pokud funkce dostane v parametru délka nulu, nebo záporné číslo, hodí výjimku typu int s hodnotou stejnou jako je v proměnné delka. V main se výjimka odchytne a vypíše text “spatne zadana delka“ a uvede se požadovaná hodnota (získaná z mechanizmu výjimky).
Pokud předaný parametr uk bude již ukazovat na platnou adresu, hodí se výjimka s textem “nealokuji – pamet je jiz alokovana“. Tato vyjimka se odchytí v main a vyslaný řetězec se vytiskne.

Promyslete:
Stačí proměnnou pole předávat pomocí ukazatele, když do ní chceme zapsat?
Nebo musíme předávat adresu na které proměnná leží pomocí TVector**?
Vysvětlete, která varianta je vhodná pro splnění zadání.
Popište rozdíly mezi jednotlivými předáními.

Pole struktur

7) Ve funkci main vytvořte proměnnou fp , která bude ukazatelem na pole struktur TVector.

8) Napište funkci AllocPoleVectoru, která naalokuje pole struktur TVector o požadovaném počtu prvků, jednotlivé prvky inicializuje stejně jako ve funkci AllocVector (můžete s výhodou využít přímo AllocVector – je nutné ošetřit výjimky z AllocVector).
Možná hlavička
AllocPoleVectoru(TVector ** aPole, size_t aPocetVektoru, size_t aPocetPrvkuVektoru,XX aInicializacniHodnota).

9) Na konci funkce main odalokuje pole struktur (tj. odalokujte naalokovanou paměť uvnitř všech prvků a potom celé pole).
DU – napište pro odalokování pole ve struktuře funkci DeAllocVector a dále napište pro odalokování pole struktur (včetně pole uvnitř) funkce DAllocPoleVectoru. Z „bezpečnostních důvodů“ po odalokování nastavte ukazatele na nullptr (aby v příštím použití bylo jasno, že data nejsou platná).

Reference

10) (Po probrání reference) napište funkci vykonávající stejnou činnost jako AllocVector(TVector*, int), ale pro předání proměnné struktury použijte reference AllocVector(TVector &, int). Nechte v programu obě funkce. Ověřte, že je to možné, a že obě fungují. Vysvětlete rozdíly.





DU – viz. sekce DU/projekt ve čtvrtém týdnu rozvrhu cvičení:

Na základě zadání 1 vytvořte program, který bude plnit požadované - jedná se o verzi v jazyce C.

Na základě zadání 2 přepište tento program tak aby využíval možností jazyka C++.

Oba programy (projekty) budou ve stejném řešení (solution) v prostředí Visual Studio.









Poslední úpravy 2017-10-09