\chapter{Popis implementace} \label{chp:PopisImplementace}

V této kapitole je popsáno jakým způsobem probíhala implementace a jakým problémům bylo nutné čelit během této fáze. Implementační část je v procesu převodu programu nejnáročnější. Implementace probíhala v Microsoft Visual Studiu 2003, protože to jediné bylo schopné zkompilovat původní kód v jazyce C, kdežto novější Microsoft Visual Studio 2005 spadlo ihned po otevření, tzn. že zde byl zde nějaký problém s analýzou obsahu jednoho souboru. 

Vlastní implementace probíhala tak, že jsem nejprve vytvořil projekt a do něj jsem zkopíroval zdrojové kódy, které jsem získal od svého vedoucího práce a které vypracoval student Zlatuška. Projekt jsem nastavil tak, aby kompilátor generoval normální konzolovou aplikaci. To bylo z toho důvodu, že veškeré ladění kódu a jednotlivých funkcí se tak podstatně zrychlilo. Konzolová aplikace měla ještě jednu výhodu, a tou bylo, že přebraný kód od studenta Zlatušky jsem nemusel vůbec změnit, abych byl schopen jej překompilovat, protože používal Microsoft Studio 6.0, které jsem používal i já. Vytvořil jsem nový projekt pro kód a stanovil adresářovou strukturu tak, jak je na \ref{fig:DirectoryStructure}. Tato struktura byla zvolena kvůli lepší orientaci v programovém kódu a s ostatními soubory, jako například projektové soubory aj.

\begin{figure}[h]
\begin{center}
\includegraphics[width=20mm]{DirectoryStructure}
\caption{Struktura adresářů}
\label{fig:DirectoryStructure}
\end{center}
\end{figure}

Obsah adresářů je následující: \\
atalantadll - obsahuje programový kód knihovny \\
bin - obsahuje binární spustitelné soubory \\
doc - obsahuje dokumenty pro dokumentaci programového kódu \\
linux - obsahuje makefile pro kompilaci pod operačním systémem Linux \\
obj - obsahuje soubory, které vznikají při kompilaci kódu \\
src - obsahuje soubory zdrojového kódu, tj. soubory *.h a soubory *.cpp \\
TestConsole - obsahuje programový kód aplikace užité pro testování \\
Testing - skripty použité pro testování \\
Text - zdrojové soubory pro bakalářskou práci \\

\section{Objektový model}
V objektovém modelu nebylo potřeba udělat žádné zásadní změny a víceméně zůstal beze změny. Byla provedena analýza jednotlivých funkcí a zkontrolováno, zda jsou všechny funkce implementovány. Na základě toho vznikl dokument, přiloženo na CD, který obsahuje komentáře a vyhodnocení tohoto porování. Byly nalezeny funkce, které nebyly implementovány a to z toho důvodu, že v původním programu sice jsou, ale nejsou využívány, proto nebylo přistoupeno k jejich převodu do programu nového. V průběhu této analýzy jsem zjistil, že chybí několik funkcí a bylo nutné je doprogramovat. Během této analýzy byl tvořen i UML diagram, který následně umožňoval lepší orientaci mezi třídami a jejich metodami. Tento UML diagram navíc do jisté míry ujasnil, k čemu jednotlivé třídy slouží. Objektový model jsem kompletně převzal od studenta Zlatušky, který naprosto vyhovuje představám jak by měl být postaven. Objektový model přibližně odpovídá struktuře souborů původního programu, což je vidět v dříve zmiňovaném souboru, kde vedle jednotlivých metod je uveden i soubor, ze kterého pochází původní programová funkce. V této části nevznikaly žádné vážnější problémy.
 
\section{Rozšíření pro rozsáhlejší obvody}
Tato náhrada byla již implementována studentem Zlatuškou, který zde ovšem zanechal všechny limity jako původní program, tj. nechal zde omezení na počet vstupů, výstupů a hradel i přesto, že již byly implementovány potřebné datové struktury místo původních, které právě obsahovaly omezení. Z tohoto důvodu jsem musel projít program a tato omezení vyjmout a upravit kód tak, aby fungoval správně a bez omezení. 

Rozšíření odpovídá náhradě statických polí polemi dynamickými. V našem případě bylo použito instancí třídy list. Tato třída umožňuje vkládání prvků a jejich následné projití pomocí iterátorů. Je to vlastně kruhový spojový obousměrný seznam, který uchovává ukazatele na vkládané prvky. Třída list je definována jako generická, kde se při vytváření instance definuje typ, který se bude do list-u ukládat. Výhodou je, že tato třída při procházení vrací ukazatel na tento typ prvku a není proto třeba provádět přetypování. Tato třída je plně dostačující, protože v našem případě není potřeba k prvkům přistupovat pomocí indexu, protože nám plně postačují funkce, které tato třída nabízí a to jsou vrácení posledního prvku, vrácení prvního prvku a projití všech prvků v seznamu. Tato implementace byla provedena studentem Zlatuškou. Já jsem ji pouze upravil na místech kde bylo kde byly metody této třídy špatně užity a často kvůli tomu docházelo k zacyklení programu, kdy program běžel jako v nekonečné smyčce.

Původní program měl limity v podobě nastavení statických konstant, které jsou použity na různých místech programu. Všechna tato místa jsem přeprogramoval tak, že jsem tyto limity odstranil a využil tak možností, které nabízí náhrada statických polí za pole dynamická.

\section{Vytvoření rozhraní knihovny}
Rozhraní knihovny bylo vytvořeno dle analýzy. Byly implementovány jednotlivé metody, které umožňují nastavení příslušného parametru nebo proudu. 

\section{Vytvoření dynamicky linkované knihovny}
Tento úkol se pro mne zpočátku zdál neřešitelný, protože jsem měl na začátku velké problémy se správným nastavením, aby byla knihovna generována správně. První problémy nastaly při nastavení projektu. Tyto problémy se vyskytly hlavně v operačním systému windows, kde bylo nutné nastavit linker, aby při linkování dynamické knihovny zároveň vytvořil i lib soubor, který je potřebný při linkování dynamické knihovny do jiného programu.

Pří implementaci bylo použito makra, které bylo definováno v hlavičkovém souboru Defines.h. Pro operační systém LINUX se nemusí uvádět nic, proto je druhá část makra prázdná. Toto je příklad jakým způsobem funguje preprocesor, který nám následně umožňuje kompilovat kód na různých operačních systémech.

Abych byl schopen vyzkoušet funkčnost knihovny, bylo nutné vytvořit nový projekt, který generoval program jako konzolovou aplikaci. V tomto programu byl program pro otestování základních funkcí dynamické knihovny. Tato aplikace je příznačně nazvána TestConsole. V tomto consolovém programu jsem nastavil linkeru referenci na lib soubor a následně stačilo definovat deklaraci using a příslušný namespace. Nutno podotknout, že linker dá do souboru lib pouze ty funkce, které jsou exportovány z DLL. Tyto funkce jsou pak volně přístupné externím programům, které tuto knihovnu budou využívat. Knihovnu lze volat a inicializovat dynamicky, ale to jsem do testovací konzole nezahrnul.

Po správném nastavení projektu a následné kompilaci, která se zdařila bez chyby, jsem program vyzkoušel. Jenže jsem narazil na to, že program generoval exception ihned na začátku programu při spouštění metody run, která provádí veškeré funkce programu dle toho jak jsou nastavené. Tento exception obsahoval, že se snažím přistupovat do oblasti na kterou nemám práva. Po delším zkoumání a různém nastavování kompilátoru jsem konečně přišel na to v čem spočívala chyba. Problém byl v tom, že jsem neměl nastaven export celé třídy, ale pouze metod této třídy. To znamená, že kompilátor negeneroval žádnou chybu při kompilaci testovacího programu, ale nastala vyjímka během jeho spuštění s hláškou popsanou výše. Po nastavení exportu celé třídy vše začlo fungovat naprosto bez problémů. 

\section{Nová funkcionalita programu}
Do programu byla naprogramována nová funkce. Tato funkcionalita rozšiřuje program o možnost odsimulování seznamu poruch nebo všech poruch pomocí náhodného vektoru pro LFSR (Linear Feedback Shift Register). Programová metoda generuje náhodný polynom a seed. Tento algoritmus má dva parametry. Prvním parametrem je počet unikátních testovacích vektorů. Tento parametr udává periodu, kdy nesmí dojít k zopakování prvního LSFR vektoru. Pokud k tomu během generování dojde, pak se znovu vygeneruje polynom a seed a spustí se generování znovu. Druhým parametrem je výstupní proud, kam se uloží náhodně vygenerovaný polynom a seed, které vyhověly při generování, tj. vygenerovaly dostatečně veliký seznam testovacích LSFR vektorů.

Formát přepínače na příkazové řádce je: -g \itshape n \normalfont ./output/file.lfsr, kde n je délka periody.
