1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
\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 Implemntierung, mittels Codewiederverwendung, auf das Überschreiben eines Kopierkonstruktors und des Operators \mbox{operator>>()} zu beschränken.
Da der Typ \mbox{CDatN} Werte variabler Bitlänge representiert, 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 muß \mbox{``s''} oder ein Wert zwischen ``2'' und ``32'' sein.
Im Hauptprogramm wird nun anhand dieses Parameters der zuständige Datentyp instanziert und die template Methode
\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, dass 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}
|