DIGITAL
Um Zeiger, sowie Wertebelegungen in Programmen besser zu verstehen, können sogenannte Zeigerdiagramme gezeichnet werden, die den Zustand des Programms zu einem bestimmten Zeitpunkt darstellen. Ein Zeiger wird dabei durch ein Sechseck mit einem Kreis darin dargestellt. Darunter steht der Zeigertyp und dessen Name. Ausgehend vom Kreis zeigt ein Pfeil auf einen Wert, beispielsweise ein Struct in Form eines Rechtecks, in dem alle Attribute erneut als Sechsecke aufgeführt sind. Dies können entweder erneut Zeiger sein oder Attribute, die mit Werten belegt und entsprechend ausgewiesen sind. Sowohl das Rechteck, als auch alle darin liegenden Sechsecke werden darunter mit ihrem (Zeiger-)Typ und einem eventuellen Variablennamen beschrieben. Schauen sie sich als Beispiel folgendes kleine Programm an, welches das Struct punkt
nutzt. Das Bild rechts zeigt ihnen das daraus resultierende Zeigerdiagramm.
struct punkt {
double x;
double y;
};
int main(){
punkt a {2.0, 1.8};
punkt *a2;
double *b = &a.x;
punkt *c = &a;
punkt *d = c;
}
\umlpointer[x=0,y=0,name=pointer1,type=double *b]{}
\umlpointer[x=0,y=2,name=pointer2,type=Punkt *c]{}
\umlpointer[x=2,y=3,name=pointer3,type=Punkt *d]{}
\umlpointer[x=5,y=3,name=pointer4,type=Punkt *a2]{}
\umlnullptr[x=7,y=3,name=nullptr-1]{}
\begin{umlstruct}[x=3, y=0]{Punkt a}
\umlstructvalue[x=0,y=0, name=value1, type=double x, value=2]{}
\umlstructvalue[x=2,y=0, name=value2, type=double y, value=1.8]{}
\end{umlstruct}
\umlpointto{pointer2}{Punkt a}
\umlpointto[geometry=-|]{pointer3}{Punkt a}
\umlpointto{pointer4}{nullptr-1}
\umlpointto{pointer1}{value1}
pointertest.tex
per pdflatex pointertest.tex
in ein PDF-Dokument übersetzen lassen.
Stellen Sie die Situation des Speichers an den markierten Punkten 1-5 des unten stehenden Programms in je einem Zeigerdiagramm dar. Geben Sie die Diagramme in einem gerenderten Format wie etwa PDF oder PNG ab. Sie können zur Erstellung der Diagramme Tikz-UML verwenden, aber eine Abgabe in einem Zeichenprogramm Ihrer Wahl (z.B. Paint, GIMP) reicht vollkommen aus.
struct result {
uint32_t num;
result *ans;
result& operator=(result &otherstruct) {
num = otherstruct.num;
ans = &otherstruct;
return *this;
}
result operator+(result &otherstruct) {
return result {num+otherstruct.num,&otherstruct};
}
};
void test(){
result a {2,nullptr};
result b {5,&a};
a.num = 4;
b.ans->num = 3;
//------1------
result c = a+b;
result *d = &c;
d->ans->num = 7;
//------2------
result *e = new result();
e->ans = &c;
e->num = 22;
e->ans->ans->num = 5;
c = a = b;
//------3------
result tmp1 = b + c;
result tmp2 = a + tmp1;
/* Bonus: Warum geht dieser Befehl nicht: result tmp4 = a + (b + c); */
a = tmp2;
result tmp3 = *e + a;
*e = tmp3;
uint32_t res = a.ans->ans->ans->ans->ans->num + e->num;
//------4------
}
int main(){
test();
//------5------ (nachdem test() fertig durchgelaufen ist)
return 0;
}