JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
Christian Ali Mehmeti-Göpel
Wintersemester 2020/21DIGITAL

Blatt 04

Aufgabe 02
Einführung in die Softwareentwicklung



Aufgabe Zeigerdiagramme

Letzte Änderung: 30. November 2020, 16:07 Uhr
12 Punkteim Detail
Ansicht:   |  

Tikz-UML & Tikz-UML-Pointer
Das schöne an UML-Diagrammen per se besteht darin, dass sie aufgrund ihrer Syntax auch programmatisch erstellt werden können. Ein Beispiel für ein solches Tool ist tikz-uml. Tikz-UML bietet zwar keine Zeigerdiagramme von Haus aus an, dies haben wir für Sie jedoch nachgerüstet. Der Code des obigen Zeigerdiagramms sieht beispielsweise folgendermaßen aus:
    \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}

Wir haben für Sie dieses Beispiel in ausführbarer Form in Ihrem Repository hinterlegt. Sie benötigen dazu eine LaTeX-Installation und können dann die Datei pointertest.tex per pdflatex pointertest.tex in ein PDF-Dokument übersetzen lassen.

Aufgabe

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;
}