\documentclass[10pt,a4paper]{beamer}
\usepackage[utf8x]{inputenc}
\usepackage{amsmath}
\usepackage[ngerman]{babel}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{tabularx}
\usepackage{subfigure} 
\usepackage{multirow}
\usepackage{rotating}
\usepackage{xcolor}
\usepackage{listings}
\lstset{
  backgroundcolor=\color{white!85!lightgray},
  basicstyle=\ttfamily,
  breaklines=true,
  captionpos=t,
  columns=fullflexible,
  commentstyle=\color{green!50!gray},
  emphstyle=\color{black}\fbox,
  extendedchars=true,
  float,
  fontadjust=false,
  frame=single,
  identifierstyle=\color{black},
  keywordstyle=\color{blue!50!gray},
  language=C,
  literate={{ö}{{\"o}}1
           {ä}{{\"a}}1
           {ü}{{\"u}}1},
  numbers=left,
  numbersep=5pt,
  numberstyle=\tiny,
  showspaces=false,
  showstringspaces=false,
  showtabs=false,
  stringstyle=\color{red!50!gray},
  tabsize=2,
  xleftmargin=0.5cm,
  xrightmargin=0.5cm,
}
\usetheme{Berlin}
\usecolortheme{default}
\beamertemplatenavigationsymbolsempty
\setbeamertemplate{footline}
{%
\begin{beamercolorbox}[wd=1.0\textwidth,ht=2.6ex,dp=1ex,leftskip=.5em,rightskip=.5em]{author in head/foot}%
\usebeamerfont{author in head/foot}%
\insertshortauthor\hfill\insertshortinstitute%
%\insertframenumber{} von \inserttotalframenumber\hfill\insertshortauthor%
\end{beamercolorbox}%
%\hspace*{-4.0ex}\hspace*{0.3\textwidth}%
\begin{beamercolorbox}[wd=1.0\textwidth,ht=2.6ex,dp=1ex,left,leftskip=.5em,rightskip=.5em]{title in head/foot}%
\usebeamerfont{title in head/foot}%
\insertshorttitle\hfill\insertframenumber{} / \inserttotalframenumber%
\end{beamercolorbox}%
}
% Titel
\title{C-Kurs 2011}  
% Untertitel 
\subtitle{\small{Datentypen}}
% Authoren + kurze Authorennamen
\author[Eugen]{Eugen Rein} 
% institut
\institute[TU-Berlin]{Technische Universität Berlin \\
\vspace*{.2 cm}
% TU-Logo
\includegraphics[scale=.1]{images/TU-Berlin-Logo.pdf}}
% letzter Compilierungstag
\date{\today} 

% begin des dokuments
\begin{document}

% erste Seite
\begin{frame}
\titlepage 
\end{frame} 

%inhaltsverzeichnis
\begin{frame}
\frametitle{Inhaltsverzeichnis}
\tableofcontents
\end{frame} 

\section{Enums} 
\begin{frame}
	\frametitle{Wiederholung Enums}
	\begin{itemize}
	\item werden auch als Aufzählungstypen bezeichnet
	\item Intern als Ganzzahlen gehandelt
	\item Elemente nacheinander durchnummeriert
	\item Beispielsweise lassen sich die Wochentage gut repräsentieren\\
		$\rightarrow$ Vortrag 1 von Paul
	
	\end{itemize}
\end{frame}
\subsection{Boolean als Enum}
\begin{frame}[fragile]
		\frametitle{Boolean repräsentiert durch Enums}
		\begin{itemize}		
		\item In C entspricht \textbf{false} dem Wert 0
		\item alles ungleich 0 ist \textbf{true}
		\end{itemize}
		 Eine Idee?
\end{frame}

\begin{frame}[fragile]
	\begin{lstlisting}
			enum bool{
				FALSE,
				TRUE
			};	
		\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
	\begin{lstlisting}
			enum bool{
				FALSE = 0,
				TRUE				
			};
		\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
	\begin{lstlisting}
			enum bool{
				FALSE = 0,
				TRUE = 7				
			};	
		\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Enum-Boolean mit typedef}
	\begin{itemize}
	\item Verwendet kann es werden mit
	\end{itemize}
	\begin{lstlisting}
		enum bool flag = TRUE;
	\end{lstlisting}
	\begin{itemize}
	\item Sieht jedoch ungewöhnlich aus
	\item Besser ist die Verwendung mit \textbf{typedef}
	\end{itemize}
	\begin{lstlisting}
		typedef enum bool{
				FALSE,
				TRUE
			} boolean;
		
		boolean flag = TRUE;
	\end{lstlisting}
\end{frame}

\subsection{Übungsaufgabe}
\begin{frame}
\frametitle{Colors mit Enums}
Schreibe eine Datenstruktur Color, die die Grundfarben \textbf{black}, \textbf{white}, \textbf{red}, \textbf{yellow}, \textbf{green}, \textbf{cyan}, \textbf{blue}, und \textbf{magenta} definiert, indem den einzelnen Varianten explizit Werte zugewiesen werden!
\end{frame}

\begin{frame}[fragile]
\frametitle{Lösung der Übungsaufgabe}
\begin{lstlisting}
typedef enum color{ 
 	WHITE= 0xFFFFFF,
	 	BLACK= 0x000000, 
	 	RED= 0xFF0000, 
	 	YELLOW= 0xFFFF00,
	 	GREEN= 0x00FF00,
	 	CYAN= 0x00FFFF, 
	 	BLUE= 0x0000FF, 
	 	MAGENTA= 0xFF00FF
} Color;
\end{lstlisting}
\end{frame}
\section{Arrays}
\begin{frame}[fragile]
	\frametitle{Java-Arrays vs. C-Arrays}
	\begin{itemize}
		\item Sind ähnlich zu Arrays in Java
		\item Länge in \textbf{Bytes} kann mit \textbf{sizeof} abgefragt werden
		\item Für echte Länge: Division mit der Größe eines Elements des Arrays
			$\rightarrow$ ebenfalls mit \textbf{sizeof}\\
	\end{itemize}
	\begin{lstlisting}
				Color rainbow[] = {RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA};
				int length = sizeof(rainbow)/sizeof(int);
	\end{lstlisting}
\end{frame}

\begin{frame}
	\frametitle{C-Arrays im Detail}
	\begin{itemize}
		\item Werte eines Arrays werden hintereinander im Speicher abgelegt
		\item Array selbst ist nur die Adresse des ersten Elements
		\item Zur Laufzeit weiß das C-Programm nicht mehr, dass es ein Array ist
		\item Bei \textbf{sizeof} legt Compiler eine Tabelle an
		\item Diese wird nach dem Übersetzen gelöscht
		\item Dort ist unter dem \textbf{Namen} die Länge des Arrays vermerkt
	\end{itemize}
\end{frame}

\begin{frame}
	\frametitle{Frage: Übergabe Arrays an Funktionen}
	Welches Problem tritt bei der Übergabe des Arrays an eine Funktion auf?
\end{frame}

\begin{frame}[fragile]
	\frametitle{Übungsaufgabe: Übergabe Arrays an Funktionen}
	Gegeben ist folgendes Code-Fragment, das in eine Funktion \textbf{printRainbow} ausgelagert werden soll.
	\begin{lstlisting}
		int i = 0;
		for(i; i<sizeof(rainbow)/sizeof(int); i++){
    		attron(COLOR_PAIR(rainbow[i]));
    		addstr("\u2588");
    		attroff(COLOR_PAIR(rainbow[i]));
  		} 
	\end{lstlisting}
	Die Funktion \textbf{printRainbow} hat dabei folgende Signatur
	\begin{lstlisting}
		void printRainbow(int rainbow[], int rainbowLength);
	\end{lstlisting}
\end{frame}

\section{Structs}
\begin{frame}
	\begin{itemize}
		\item Funktion \textbf{printRainbow} wird bei mehreren Arrays, die übergeben werden schnell unübersichtlich
		\item C bietet rudimentär auch Klassen an\\
				$\rightarrow$ Sprachkonzept der \textbf{structs}
		\item Ähnlich zu Enums
		\item Damit können wir Arrays wie in Java nachbauen
	\end{itemize}
	\end{frame}
	\begin{frame}[fragile]
	\frametitle{Implementierung: Arrays wie in Java}
	\begin{lstlisting}
		typedef struct rainbow{
			  const int length;
			  int color[6];
		} Rainbow;
		...
		/*Konstruktor aufrufen*/
		Rainbow rainbow={ 
		  .length= 6,
		  .color= {COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_CYAN, COLOR_BLUE, COLOR_MAGENTA} 
		};
		
		/*Laenge des Arrays*/
		int array_length = rainbow.length
	\end{lstlisting}
\end{frame}

\begin{frame}
	\frametitle{Übungsaufgabe: Colors Revisited}
	Farben als Enums zu definieren, war zwar ein nettes Einsteigerbeispiel, bewährt sich in der Praxis aber nicht sonderlich, 
	weil man die einzelnen Farbkanäle nicht gezielt verändern kann. 
	Deklariert ein struct color mit den \glqq{}Membervariablen\grqq{} \textbf{red}, \textbf{green} uns \textbf{blue} und definiert unsere altbekannten Variablen \textbf{black}, \textbf{white}, \textbf{red}, \textbf{yellow}, \textbf{green}, \textbf{cyan}, \textbf{blue}, und \textbf{magenta} als \glqq{}Objekte\grqq{}.
\end{frame}
 
\section{Unions}
\begin{frame}
	\begin{itemize}
		\item Wird genauso wie ein Struct deklariert
		\item Dabei verwendet man jedoch das Schlüsselwort \textbf{union}
		\item Alle Variablen sind Bezeichner für dieselbe Speicherstelle
		\item Damit können wir \textbf{Color} erweitern, sodass wir RGB-Farben als auch HEX-Werte speichern können.
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Erweiterung des Color-Types}
	\begin{lstlisting}
	typedef union color{
	  struct rgb{
	 	  unsigned char red; 
	 	  unsigned char green; 
	 	  unsigned char blue;
	  } rgb;
	  int hex; 
	} Color;
	\end{lstlisting}
\end{frame}

\end{document}