Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
H
hp
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Peter Gerwinski
hp
Commits
009b96c5
Commit
009b96c5
authored
Feb 4, 2017
by
Peter Gerwinski
Browse files
Options
Downloads
Patches
Plain Diff
Skript bis einschließlich Kapitel 6: Objektorientierte Programmierung
parent
57097978
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
script/hp-2016ws.pdf
+0
-0
0 additions, 0 deletions
script/hp-2016ws.pdf
script/hp-2016ws.tex
+153
-9
153 additions, 9 deletions
script/hp-2016ws.tex
with
153 additions
and
9 deletions
script/hp-2016ws.pdf
+
0
−
0
View file @
009b96c5
No preview for this file type
This diff is collapsed.
Click to expand it.
script/hp-2016ws.tex
+
153
−
9
View file @
009b96c5
...
@@ -4329,7 +4329,7 @@
...
@@ -4329,7 +4329,7 @@
Datei: RP6Base/RP6Base
\_
Examples/RP6Examples
\_
20080915/RP6Lib/RP6base/RP6RobotBaseLib.c
\\
Datei: RP6Base/RP6Base
\_
Examples/RP6Examples
\_
20080915/RP6Lib/RP6base/RP6RobotBaseLib.c
\\
Suchbegriff: setMotorDir
Suchbegriff: setMotorDir
\goodbreak
\goodbreak
\begin{
verbatim
}
\begin{
lstlisting
}
void setMotorDir(uint8
_
t left
_
dir, uint8
_
t right
_
dir)
void setMotorDir(uint8
_
t left
_
dir, uint8
_
t right
_
dir)
{
{
mleft
_
dir = left
_
dir;
mleft
_
dir = left
_
dir;
...
@@ -4344,7 +4344,8 @@
...
@@ -4344,7 +4344,8 @@
PORTC |= DIR
_
R;
PORTC |= DIR
_
R;
else
else
PORTC
&
= ~DIR
_
R;
PORTC
&
= ~DIR
_
R;
}
\end{verbatim}
}
\end{lstlisting}
Die Variable
\lstinline
|PORTC| ist ein Output-Port.
Die Variable
\lstinline
|PORTC| ist ein Output-Port.
Durch Manipulation einzelner Bits in dieser Variablen
Durch Manipulation einzelner Bits in dieser Variablen
...
@@ -4381,13 +4382,14 @@
...
@@ -4381,13 +4382,14 @@
Beispiel für die Verwendung eines Interrupts: Roboter-Steuerung
\\
Beispiel für die Verwendung eines Interrupts: Roboter-Steuerung
\\
Datei: RP6Base/RP6Base
\_
Examples/RP6Examples
\_
20080915/RP6Lib/RP6base/RP6RobotBaseLib.c
\\
Datei: RP6Base/RP6Base
\_
Examples/RP6Examples
\_
20080915/RP6Lib/RP6base/RP6RobotBaseLib.c
\\
Suchbegriff: ISR
Suchbegriff: ISR
\begin{
verbatim
}
\begin{
lstlisting
}
ISR (INT0
_
vect)
ISR (INT0
_
vect)
{
{
mleft
_
dist++;
mleft
_
dist++;
mleft
_
counter++;
mleft
_
counter++;
/* ... */
/* ... */
}
\end{verbatim}
}
\end{lstlisting}
\begin{itemize}
\begin{itemize}
\item
\item
Durch das Schlüsselwort
\lstinline
|ISR| anstelle von z.
\,
B.
\ \lstinline
|void|
Durch das Schlüsselwort
\lstinline
|ISR| anstelle von z.
\,
B.
\ \lstinline
|void|
...
@@ -4482,10 +4484,9 @@
...
@@ -4482,10 +4484,9 @@
\subsection
{
volatile-Variable
}
\subsection
{
volatile-Variable
}
Im C-Quelltext fällt auf, daß die Zähler-Variablen
\lstinline
|mleft
_
dist| und
\lstinline
|mleft
_
counter|
Im C-Quelltext fällt auf, daß die Zähler-Variablen
\lstinline
|mleft
_
dist| und
\lstinline
|mleft
_
counter|
\\
als
\lstinline
|volatile|
\break\lstinline
|uint16
_
t mleft
_
counter| bzw.
\ \lstinline
|volatile uint16
_
t mleft
_
dist| deklariert
als
\lstinline
|volatile uint16
_
t mleft
_
counter| bzw.
\ \lstinline
|volatile uint16
_
t mleft
_
dist| deklariert sind
\\
sind anstatt einfach nur als
anstatt einfach nur als
\lstinline
|uint16
_
t mleft
_
counter| und
\lstinline
|uint16
_
t mleft
_
dist|.
\lstinline
|uint16
_
t mleft
_
counter| und
\lstinline
|uint16
_
t mleft
_
dist|.
Das Schlüsselwort
\lstinline
|volatile| teilt dem C-Compiler mit,
Das Schlüsselwort
\lstinline
|volatile| teilt dem C-Compiler mit,
daß eine Variable immer im Speicher (RAM) aufbewahrt werden muß
daß eine Variable immer im Speicher (RAM) aufbewahrt werden muß
...
@@ -5430,10 +5431,153 @@
...
@@ -5430,10 +5431,153 @@
\subsection
{
Virtuelle Methoden
}
\subsection
{
Virtuelle Methoden
}
\underconstruction
In großen Programmen wird die Anzahl der verwendeten Objekt
-
Datentypen
schnell sehr groß. Eine Methode, die per
\lstinline
{
if
}
unterscheiden muß,
welche Art von Objekt sie gerade bearbeitet,
enthält dann lange
\lstinline
{
if
}
-
Ketten
und wird dadurch sehr unübersichtlich.
\begin
{
lstlisting
}
void print
_
object
(
t
_
object
*
this
)
{
if
(
this
-
>base.type
==
T
_
INTEGER
)
printf
(
"Integer:
%d\n", this->integer.content);
else if
(
this
-
>base.type
==
T
_
STRING
)
printf
(
"String:
\"
%s\"\n", this->string.content);
}
\end
{
lstlisting
}
Es wäre vorteilhaft, wenn alle Methoden,
die sich auf einen bestimmten Objekttyp beziehen,
auch nebeneinander im Quelltext stehen könnten,
anstatt sich über viele Funktionen zu verteilen.
\begin
{
lstlisting
}
void print
_
integer
(
t
_
object
*
this
)
{
printf
(
"Integer:
%d\n", this->integer.content);
}
void print
_
string
(
t
_
object
*
this
)
{
printf
(
"String:
\"
%s\"\n", this->string.content);
}
\end
{
lstlisting
}
Um dies zu realisieren, verwendet man
\emph
{
Zeiger auf Funktionen
}
:
\begin
{
lstlisting
}
typedef struct
{
void
(*
print
)
(
union t
_
object
*
this
)
;
}
t
_
base;
typedef struct
{
void
(*
print
)
(
union t
_
object
*
this
)
;
int content;
}
t
_
integer;
typedef struct
{
void
(*
print
)
(
union t
_
object
*
this
)
;
char
*
content;
}
t
_
string;
\end
{
lstlisting
}
Um einen Zeiger auf eine Funktion zu deklarieren,
deklariert man eine "`normale"' Funktion,
deren "`Name"' die Gestalt
\lstinline
{
(*
print
)
}
hat
--
mit dem vorangestellten Stern und den umschließenden Klammern.
(
Merkregel: Das, worauf
\lstinline
{
print
}
zeigt
--
also
\lstinline
{
*
print
}
--
,
ist eine Funktion.
)
Der Aufruf einer derartigen Funktion erfolgt
über den im Objekt gespeicherten Zeiger:
\begin
{
lstlisting
}
for
(
int i
=
0
; object
[
i
]
; i
++)
object
[
i
]-
>print
(
object
[
i
])
;
\end
{
lstlisting
}
Eine derartige Funktion, die für verschiedene Objekttypen existiert
und bei deren Aufruf automatisch "`die passende"' Funktion ausgewählt wird,
heißt
\newterm
{
virtuelle Methode
}
.
\breath
Jeder Methode wird ein Zeiger
\lstinline
{
t
_
object
*
this
}
auf das Objekt
als Parameter mitgegeben.
Bei der Deklaration der virtuellen Methode innerhalb des Objekt
-
Typs
wird daher der Union
-
Typ
\lstinline
{
t
_
object
}
bereits benötigt.
Dieser kann jedoch erst später deklariert werden,
wenn die darin enthaltenen Objekt
-
Typen bekannt sind.
Um dieses Problem zu lösen, muß die
\lstinline
{
union t
_
object
}
"`doppelt"' deklariert werden:
\begin
{
lstlisting
}
typedef union t
_
object
{
t
_
base base;
t
_
integer integer;
t
_
string string;
}
t
_
object;
\end
{
lstlisting
}
Dadurch daß
\lstinline
{
t
_
object
}
auch oben,
hinter dem Schlüsselwort
\lstinline
{
union
}
steht,
ist neben dem Datentyp
\lstinline
{
t
_
object
}
auch ein Datentype
\lstinline
{
union t
_
object
}
(
in einem separaten Namensraum
)
bekannt.
Derartig deklarierte Typen kann man
\newterm
{
vorwärts
-
deklarieren
\/
}
:
Wenn man eine Zeile
\begin
{
lstlisting
}
union t
_
object;
\end
{
lstlisting
}
den anderen Deklarationen voranstellt,
wissen diese, daß es später eine
\lstinline
{
union t
_
object
}
geben wird.
Zeiger auf diese
--
noch unbekannte
--
\lstinline
{
union
}
dürfen dann bereits in Deklarationen
--
hier: Funktionsparameter
--
verwendet werden.
\breath
Das Beispiel
-
Programm
\gitfile
{
20170109
}{
objects
-
12
.c
}
illustriert,
wie man virtuelle Methoden in C realisieren kann.
In größeren Projekten ist es nicht effizient,
in jeder einzelnen Objektinstanz
(=
Variable des Objekttyps
)
sämtliche Zeiger auf sämtliche virtuellen Methoden zu speichern.
Stattdessen speichert man in der Objektinstanz
lediglich einen Zeiger auf eine Tabelle von Zeigern auf die virtuellen Methoden,
die sog.
\ \newterm
{
virtuelle Methodentabelle
}
--
siehe das Beispiel
-
Programm
\gitfile
{
20170109
}{
objects
-
13
.c
}
.
\subsection
{
Einführung in C
++
}
\subsection
{
Einführung in C
++
}
Objektorientierte Programmierung in C ist sehr mühselig und fehleranfällig:
Objekt
-
Datentypen müssen manuell so abgeglichen werden,
daß sie in ihren ersten Datenfeldern übereinstimmen,
Konstruktoren müssen manuell erstellt werden, usw.
Um diese Probleme zu beheben, wurden neue Computersprachen entwickelt,
die objektorientierte Programmierung durch neue Sprachelemente unterstützen.
Die objektorientierte Weiterentwicklung von C ist C
++
.
Andere bekannte objektorientierte Sprachen sind Java, C
\#
, Python, JavaScript,
PHP, verschiedene Pascal
-
Dialekte und viele weitere.
Das Beispiel
-
Programm
\gitfile
{
20170109
}{
objects
-
14
.cpp
}
ist eine direkte Übersetzung von
\gitfile
{
20170109
}{
objects
-
12
.c
}
nach C
++
.
In C
++
kümmert sich der Compiler um die Vererbung zwischen den Objekt
-
Datentypen,
um die Verwaltung der Zeiger auf virtuelle Methoden,
um korrekte Konstruktoren und um vieles mehr.
Auch die Übergabe des Objekt
-
Zeigers
\lstinline
{
this
}
an Methoden
erfolgt in C
++
automatisch: Aus
\lstinline
{
object
[
i
]-
>base.print
(
object
[
i
])
;
}
wird
\lstinline
{
object
[
i
]-
>print
()
;
}
.
Der Quelltext wird dadurch kürzer und weniger fehleranfällig.
\section
{
Datenstrukturen
}
\section
{
Datenstrukturen
}
\underconstruction
\underconstruction
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment