\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 zwei zusätzliche Datentypen, \mbox{CDatSet} und \mbox{CDatN}, implementiert und der Programmcode generisch gestaltet. Dabei wurde \mbox{CDatSet} vom existierenden Typ \mbox{CDat} und boost::operators<\mbox{CDatSet}> 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 boost::operators<\mbox{CDatN}> abgeleitet und dabei eine zusätzliche Methode \mbox{align()} definiert, die sicherstellt, dass der transportierte Wert immer auf die geforderte Bitanzahl konvertiert 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 konvertiert 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 nun 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 Typparameter den, im Hauptprogramm, instanzierten Datentyp erhalten. \newpage %================================================================== \begin{center} \begin{figure}[htb] \epsfxsize=1.6\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 Löschen der Register im Destruktor nicht mehr notwendig. Siehe auch Punkt~\ref{Probleme und Fallstricke}.\\ \subsection{Fehlerbehandlung} Es wurden mehrere Exceptions, als Subklassen der jeweiligen Templateklassen, von Typ \mbox{std::invalid\_argument} abgeleitet. Diese sind \mbox{CCPUError}, \mbox{CInstructionError}, \mbox{CMemError} und \mbox{CProgramError}. Wird zB.: eine Exception von Typ \mbox{CInstructinError} geworfen, so wird sie in \mbox{CCPU} zu \mbox{CCPUError} umgewandelt und an das Hauptprogramm weitergereicht, wo wider 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 die Anzahl der Instruktionen in CProgram, den maximal darstellbaren Wert übersteigt. In diesen Fall ist das Programmverhalten undefiniert. Auf Grund der Forderung, den Defaultkonstruktor von \mbox{CDatN} zu deaktivieren, wurden einige Probleme initiiert. Es war 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}