From 384539f7cc9feaa7ef7cee385cce472c6966c843 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 27 Apr 2009 00:24:16 +0200 Subject: Adding ue1 --- ue1/protokoll/protokoll.tex | 226 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 ue1/protokoll/protokoll.tex (limited to 'ue1/protokoll/protokoll.tex') diff --git a/ue1/protokoll/protokoll.tex b/ue1/protokoll/protokoll.tex new file mode 100644 index 0000000..a8c7928 --- /dev/null +++ b/ue1/protokoll/protokoll.tex @@ -0,0 +1,226 @@ +\documentclass[12pt,a4paper,titlepage,oneside]{article} +\usepackage[utf8]{inputenc} +\usepackage{oop_prot} +\usepackage{url} +\usepackage{pdfpages} +\usepackage{booktabs} + +\title{Beispiel 1} + +\author{Manuel Mausz, \matrnr 0728348\\ + {\small manuel-tu@mausz.at} +} + +\begin{document} + +% create titlepage +\maketitle + +\tableofcontents +\newpage + +%------------------------------------------------------------------ +%------------------------------------------------------------------ + +\section{Aufgabenstellung - Beispiel 1} +\includegraphics[width=\textwidth,page=1]{../angabe.pdf} +\includegraphics[width=\textwidth,page=2]{../angabe.pdf} + +%------------------------------------------------------------------ +%------------------------------------------------------------------ + +\section{Beispiel 1} + +\subsection{Design}\label{Design} + +Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe. + + +Die Klasse CScriptParser übernimmt das Parsen der per Commandlineparameter +übergebenen Scriptdatei als String, wobei dieser bereits im Konstruktor +übergeben werden muss. Zum Anstoßen des Parsen dient die Funktion parse(). +Der (simple) Parser arbeitet Zeilenbasiert und erwartet pro Zeile einen +Funktionsaufruf im Syntax: funktionsname(param1, ... paramX). Schachteln von +Funktionen ist nicht erlaubt. Der erste Befehl eines Blocks muss der Befehl +``read'' sein, der Befehl ``write'' beendet einen Block. Alle Funktionsparameter +werden zusammen in einer Liste gespeichert und den entsprechenden Funktionen +übergeben. Whitespaces und Anführungszeichen werden bereits vorab gelöscht. + + +Tritt ein Fehler während des Parsens auf, werden Instanzen der Klasse +\mbox{CSriptError::ParserError} als Exception geworfen. Über die Methode +\mbox{getLine()} der Exception kann die aktuelle Zeile der Scriptdatei, die den +Fehler erzeugt hat, ausgelesen werden.\\ + + +Da der Scriptbefehl ``read'' und ``write'' einen Dateitypparameter enthält, +ist es potentiell möglich verschiedene Dateitypen zu öffnen und zu bearbeiten. +Um dies aus der Sicht des Parsers generisch durchzuführen, müssen alle Klassen, +die Dateioperationen durchführen können, von der Abstrakten Klasse \mbox{CFile} +abgeleitet sein und somit mindestens dessen virtuelle Methoden implementieren. +Alle Implementation müssen weiters im Konstruktor die unterstützten Dateitypen +in die Membervariable m\_types hinzufügen, damit der Parser die jeweils +zuständige Implementation verwenden kann. + + +Die Methode \mbox{callFunc(...)} dient zum Aufruf von dateitypspezifische +Scriptfunktionen. Hierzu übergibt der Parser automatisch alle unbekannten +Funktionen und dessen Parameter innerhalb eines Block (abgesehen von ``read'' +und ``write'') der jeweils zuständigen Instanz. + + +Zur Fehlerbehandlung sollen Implementationen von CFile Instanzen der +Klasse \mbox{CFile::FileError} als Exception werfen. Diese werden vom Parser +gefangen und in Instanzen der eigenen Exception des Parsers +\mbox{CSriptError::ParserError} übersetzt.\\ + + +Die Klasse \mbox{CBitmap} implementiert die Abstrakte Klasse \mbox{CFile} und +kann Dateien des Types ``BMP'' (Windows Bitmap) bearbeiten. Beim Lesen der +Datei werden rudimentäre Checks des Dateiheaders durchgeführt. Der Speicher der +Pixel, wird wie gewünscht dynamisch alloziert. Um aber die verschiedenen +möglichen Farbtiefen von Windows Bitmap zu unterstützen, werden die +Schreiboperationen auf die Pixeldaten an eine Instanz der je nach Farbtiefe +zuständigen Implementation der Abstrakten Klasse \mbox{CPixelFormat} delegiert. +Diese Instanz wird während der Analyse des Dateiheaders ebenfalls dynamisch +allokiert.\\ + + +Damit Implementationen der abstrakten Klasse \mbox{CPixelFormat} direkt auf die +Daten des Windows Bitmap zugreifen können, wird im Konstruktor ein Pointer auf +die Instanz von \mbox{CBitmap} übergeben. Über die Public Getter-Methoden von +\mbox{CBitmap} erfolgt der direkt Zugriff. Fehlerbehandlung erfolgt +Exceptions der Klasse \mbox{CPixelFormat::PixelFormatError}. + +%================================================================== +\begin{figure}[htb] +\begin{center} +\epsfxsize=0.9\textwidth\epsfbox{ClassDiagram1.png} +\end{center} +\caption{Klassendiagramm 1} +\label{fig:classdiagram1} +\end{figure} +%================================================================== + + +\subsection{Verwaltung der Ressourcen} + +Alle Klassen, die im Laufe ihrer Existenz Ressourcen dynamische +allozieren, initialisieren die jeweiligen Membervariablen im Konstruktor auf +NULL und geben diese, sofern tatsächlich alloziert, im spätestens Destruktor +wieder frei.\\ +Alle Dateien, die geöffnet werden, werden nach dem Abfangen der Exception auch +wieder geschlossen, sofern alle möglichen, auftretenden Exceptions +(\mbox{std::bad\_alloc} ausgenommen) auch vorab übersetzt wurden. + +\subsection{Fehlerbehandlung} + +Alle Implementationen der abstrakten Klasse \mbox{CPixelFormat} werfen +Exceptions der Klasse \mbox{CPixelFormat::PixelFormatError}. Diese werden von +\mbox{CBitmap} gefangen und in Exceptions der Klasse \mbox{CFile::FileError} +übersetzt, welche wiederum von der Klasse \mbox{CScriptParser} gefangen und in +Exceptions der Klasse \mbox{CScriptParser::ParserError} übersetzt werden.\\ +Diese Exceptions sowie Exceptions des Typs \mbox{std::exception} werden +schlussendlich vom Hauptprogramm gefangen und geben eine entsprechende +Fehlermeldung an den Benutzer auf stderr aus. + +\subsection{Implementierung} +Siehe Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie +Punkt~\ref{Listings}. + + +Alle Exceptions wurden von \mbox{std::invalid\_argument} abgeleitet und der +Konstruktor gemäß den üblichen Konventionen implementiert: + +%================================================================== +\begin{lstlisting}{} +ParserError(const std::string& what) + : std::invalid_argument(what) +{} +\end{lstlisting} +%================================================================== + + +%------------------------------------------------------------------ +%------------------------------------------------------------------ + +\section{Projektverlauf} + + +\subsection{Probleme und Fallstricke} + +In der Hoffnung das in der nächsten Aufgabe weitere Funktionen, Dateitypen +und/oder Farbtiefen des Windows Bitmaps-Formats verlangt werden, wurden +diese sehr generisch implementiert.\\ +Ursprünglich wollte ich die jeweilig unterstützen Scriptfunktionen mittels +\mbox{std::map} an den Scriptparser zurückgeben, +sodass dieser direkt die jeweilige Methode (per Pointer) aufrufen kann. Dies +funktioniert jedoch logischerweise nur bei statischen Methoden. Daher die +einfacher Methode über die callFunc-Methoden, die die Parameter an die +jeweiligen internen Methoden weiterdelegieren. + + +Da sich \mbox{CBitmap} und \mbox{CPixelFormat} gegenseitig referenzieren, +müssen die jeweiligen Klassen im Headerfile der anderen Klasse vorab deklariert +werden. Andernfalls kann der Compiler die Klasse aufgrund der rekursiven +Inklusion nicht finden. + +\subsection{Arbeitsaufwand} + +\begin{tabular}{ll} + \toprule + Entwicklungsschritt / Meilenstein & Arbeitsaufwand in Stunden\\ + \midrule + Erstes Design & 15 Minuten\\ + \hline + Implementierung (und leichte Anpassung des Designs) & 1 Tag\\ + \hline + Dokumentation (Doxygen) und Überprüfung alle\\ + Anforderungen gemäß der Programmierrichtlinien & 2 Tage\\ + \hline + Erstellung des Protokolls & 1 Tag\\ + \bottomrule +\end{tabular} + +%------------------------------------------------------------------ +%------------------------------------------------------------------ + +\section{Listings}\label{Listings} + +\subsection{imgsynth.cpp} +\lstinputlisting{../imgsynth/imgsynth.cpp} + +\newpage +\subsection{cscriptparser.h} +\lstinputlisting{../imgsynth/cscriptparser.h} + +\newpage +\subsection{cscriptparser.cpp} +\lstinputlisting{../imgsynth/cscriptparser.cpp} + +\newpage +\subsection{cfile.h} +\lstinputlisting{../imgsynth/cfile.h} + +\newpage +\subsection{cbitmap.h} +\lstinputlisting{../imgsynth/cbitmap.h} + +\newpage +\subsection{cbitmap.cpp} +\lstinputlisting{../imgsynth/cbitmap.cpp} + +\newpage +\subsection{cpixelformat.h} +\lstinputlisting{../imgsynth/cpixelformat.h} + +\newpage +\subsection{cpixelformat\_24.h} +\lstinputlisting{../imgsynth/cpixelformat_24.h} + +\newpage +\subsection{cpixelformat\_24.cpp} +\lstinputlisting{../imgsynth/cpixelformat_24.cpp} + +\end{document} + -- cgit v1.2.3