\documentclass[12pt,a4paper,titlepage,oneside]{article} \usepackage[utf8]{inputenc} \usepackage{oop_prot} \usepackage{url} \usepackage{pdfpages} \usepackage{booktabs} \title{Beispiel 4} \author{ Günther Neuwirth, \matrnr 0626638\\ {\small e0626638@student.tuwien.ac.at}\\ Manuel Mausz, \matrnr 0728348\\ {\small manuel-tu@mausz.at}\\ } \begin{document} % create titlepage \maketitle \tableofcontents \newpage %------------------------------------------------------------------ %------------------------------------------------------------------ \section{Aufgabenstellung - Beispiel 4} \includegraphics[width=\textwidth,page=1]{../angabe.pdf} \includegraphics[width=\textwidth,page=2]{../angabe.pdf} %------------------------------------------------------------------ %------------------------------------------------------------------ \section{Beispiel 4} \subsection{Design}\label{Design} Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe. Wie gefordert wurden die zusätzliche Datentypen \mbox{CDatSet} und \mbox{CDatN} implementiert und der Programmcode generisch gestaltet. Dabei wurde \mbox{CDatSet} vom existierenden Typ \mbox{CDat} und \mbox{boost::operators} mittels Mehrfachvererbung abgeleitet. So war es möglich die Implementierung, mittels Codewiederverwendung, auf das Überschreiben eines Kopierkonstruktors und des Operators \mbox{operator>>()} zu beschränken. Da der Typ \mbox{CDatN} Werte variabler Bitlänge repräsentiert, war es notwendig diesen vollständig neu zu implementieren. Es wurde von \mbox{boost::operators} abgeleitet und dabei in jeder Methode sicherstellt, dass der transportierte Wert immer auf die geforderte Bitanzahl beschränkt wird. Weiters wurde ein Kopierkonstruktor definiert, der einen Integerwert und einen vorzeichenlosen Integerwert als Argument erwartet. Letzterer ist mit dem Defaultwert 31 deklariert und repräsentiert die Bitanzahl, auf die Ersterer beschränkt wird. Damit ist es möglich alle vorhandenen Datentypen einheitlich zu verarbeiten. Der Defaultkonstruktor wurde wie gewünscht deaktiviert. Um nun die Wahl des Datentyps zu ermöglichen, wurde die Synopsis des Programms mit \mbox{``-f''} erweitert. Der Parameter dieser Option muss \mbox{``s''} oder ein Wert zwischen ``2'' und ``32'' sein. Im Hauptprogramm wird anhand dieses Parameters der zuständige Datentyp instanziert und die Templatemethode \mbox{cpu\_run()} aufgerufen, welche die Initialisierung und Abarbeitung des Programms anstößt. Damit das Programm mit den verschiedenen Datentypen umgehen kann, wurden \mbox{CCPU}, \mbox{CMem}, \mbox{CProgram}, \mbox{CInstuction} und die abgeleiteten \mbox{Instructions} zu Templates umgewandelt, die als Template-Parameter den Typ des im Hauptprogramm instanzierten Datentyps, erwarten. \newpage %================================================================== \begin{center} \begin{figure}[htb] \epsfxsize=1.1\textwidth\epsfbox{mycpu.png} \caption{Klassendiagramm 1} \label{fig:classdiagram1} \end{figure} \end{center} %================================================================== \newpage \subsection{Verwaltung der Ressourcen} Die Register von \mbox{CCPU} werden nun, anstatt in einem Array, in einem Vector verwaltet. Dieser wird mit der Anzahl der Register und dem, im Hauptprogramm, instanzierten Datentyp initialisiert. Dadurch ist das eigenhändige Löschen der Register im Destruktor nicht mehr notwendig, da dies der Destruktor des Vectors erledigt. Siehe auch Punkt~\ref{Probleme und Fallstricke}.\\ \subsection{Fehlerbehandlung} Es wurden mehrere Exceptions von der Klasse \mbox{std::invalid\_argument} abgeleitet. Diese sind \mbox{CCPUError}, \mbox{CInstructionError}, \mbox{CMemError} und \mbox{CProgramError} und werden von ihren zugehörigen Klassen entsprechend geworfen. Wird zB.: eine Exception von Typ \mbox{CInstructinError} geworfen, so wird sie in \mbox{CCPU} zu \mbox{CCPUError} umgewandelt und an das Hauptprogramm weitergereicht, in dem wiederum eine Umwandlung in \mbox{runtime\_error()} stattfindet. Das Fangen einer \mbox{runtime\_error()} Exeption bewirkt eine fehlerbeschreibende Ausgabe auf \mbox{std::cerr} und den Programmabbruch mit Exitstatus 1. \subsection{Implementierung} Siehe Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie Punkt~\ref{Listings}.\\ \section{Projektverlauf} \subsection{Probleme und Fallstricke}\label{Probleme und Fallstricke} \mbox{CDatN}: Mit der in der Angabe vorgeschlagenen Methode zur Begrenzung der Bitanzahl, ist es nur möglich positive Zahlen zu verarbeiten. Somit entspricht -1 dem Maximum der, mit der Bitanzahl, darstellbaren positiven Zahl usw.. Ein weiteres Problem besteht darin, wenn Register nicht mehr gelesen werden können, weil der Index des Registers ausserhalb des Bereichs des Datentyps liegt. In diesen Fall ist das Programmverhalten undefiniert. Auf Grund der Forderung, den Defaultkonstruktor von \mbox{CDatN} zu deaktivieren, traten einige Probleme auf. So war es beispielsweise nicht weiter möglich, die Register von \mbox{CCPU} in einem Array zu organisieren, da zur Deklaration ein Defaultkonstruktor notwendig ist. Weiters musste eine Alternative zum nicht mehr anwendbaren \mbox{boost::lexical\_cast} in \mbox{CMem} implementiert werden. \subsection{Arbeitsaufwand} \begin{tabular}{ll} \toprule Entwicklungsschritt / Meilenstein & Arbeitsaufwand\\ \midrule Erstes Design & 1 Tage\\ \hline Implementierung & 2 Tage\\ \hline Dokumentation (Doxygen) und Überprüfung aller\\ Anforderungen gemäß der Programmierrichtlinien & 4 Stunden\\ \hline Erstellung des Protokolls & 2 Stunden\\ \bottomrule \end{tabular} %------------------------------------------------------------------ %------------------------------------------------------------------ \newpage \section{Listings}\label{Listings} \subsection{mycpu.cpp} \lstinputlisting{../mycpu/mycpu.cpp} \newpage \subsection{cdat.h} \lstinputlisting{../mycpu/cdat.h} \newpage \subsection{cdatset.h} \lstinputlisting{../mycpu/cdatset.h} \newpage \subsection{cdatn.h} \lstinputlisting{../mycpu/cdatn.h} \newpage \subsection{cmem.h} \lstinputlisting{../mycpu/cmem.h} \newpage \subsection{cinstruction.h} \lstinputlisting{../mycpu/cinstruction.h} \newpage \subsection{instructions.h} \lstinputlisting{../mycpu/instructions.h} \newpage \subsection{cdisplay.h} \lstinputlisting{../mycpu/cdisplay.h} \newpage \subsection{displays.h} \lstinputlisting{../mycpu/displays.h} \newpage \subsection{cprogram.h} \lstinputlisting{../mycpu/cprogram.h} \newpage \subsection{ccpu.h} \lstinputlisting{../mycpu/ccpu.h} \end{document}