3. Aufgabenblatt

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: 3. Aufgabenblatt

Beitrag von Jens Huthmann » 29. Jan 2013 15:53

LordHoto hat geschrieben: Ich würde die Aussagen von Herrn Huthmann so interpretieren, dass man "current" und "size" benutzen darf ohne sie zu deklarieren.
Sie haben recht das current eigentlich noch erzeugt werden muss. Für diese Aufgabe können Sie diese aber ohne deklaration verwenden. size ist im Sinne der Aufgabe ein "Konstante" und muss daher nicht mehr deklariert werden. Es kann aber sein das Sie eine Zählvariable für die Schleifeniteration benötigen.

jonas
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 177
Registriert: 5. Okt 2008 21:35
Wohnort: DA

Re: 3. Aufgabenblatt

Beitrag von jonas » 30. Jan 2013 16:26

Jens Huthmann hat geschrieben:
errt hat geschrieben:Mir scheint, in Aufgabe 3.5 haben sich ein paar Fehler eingeschlichen. Insbesondere passt der angegebene Aufruf mfib(4) nicht zur Signatur von mfib. Ich nehme an, wir sollen mfib(4, var n) betrachten?
Da haben Sie recht. Es soll mfib(4, var n) sein.

D.h. wir sollen von einem völlig unbekannten Kontext ausgehen?
Uns bekannt ist nur, dass anfangs der Wert "4" und eine unbekannte Adresse (für var n) als nächstes auf dem Stack liegen?
Somit würde unser Stack mit irgendeiner Adresse starten und es gäbe etwas "oben drüber" ?

Das gegebene Beispielprogram weckt den Eindruck als ob man einfach nur "Eingabe = 4" annehmen soll.
Dann wäre "var n" die Adresse der bekannten globalen Variable und man könnte den kompletten Stack angeben.


Ps: bye the way, die Listings-Unterschrift ist auch fehlerhaft, soll wohl "zu Aufgabe 3.5a" heißen.

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: 3. Aufgabenblatt

Beitrag von Jens Huthmann » 30. Jan 2013 17:44

jonas hat geschrieben:
Jens Huthmann hat geschrieben:
errt hat geschrieben:Mir scheint, in Aufgabe 3.5 haben sich ein paar Fehler eingeschlichen. Insbesondere passt der angegebene Aufruf mfib(4) nicht zur Signatur von mfib. Ich nehme an, wir sollen mfib(4, var n) betrachten?
Da haben Sie recht. Es soll mfib(4, var n) sein.

D.h. wir sollen von einem völlig unbekannten Kontext ausgehen?
Uns bekannt ist nur, dass anfangs der Wert "4" und eine unbekannte Adresse (für var n) als nächstes auf dem Stack liegen?
Somit würde unser Stack mit irgendeiner Adresse starten und es gäbe etwas "oben drüber" ?

Das gegebene Beispielprogram weckt den Eindruck als ob man einfach nur "Eingabe = 4" annehmen soll.
Dann wäre "var n" die Adresse der bekannten globalen Variable und man könnte den kompletten Stack angeben.
Ich meinte das man im Beispielprogramm durch getint den Wert 4 für die Variable n bekommt und dann die verschiedenen Stackkonfigurationen die durchlaufen werden bei und nach jedem Aufruf von mfib angebene werden sollen.

jonas hat geschrieben:Ps: bye the way, die Listings-Unterschrift ist auch fehlerhaft, soll wohl "zu Aufgabe 3.5a" heißen.
Hier hab ich wohl die Latex-Referenzen falsch gesetzt...danke für den Hinweis

jonas
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 177
Registriert: 5. Okt 2008 21:35
Wohnort: DA

Re: 3. Aufgabenblatt

Beitrag von jonas » 30. Jan 2013 17:54

Oh, danke für die Klarstellung.

Martek
Windoof-User
Windoof-User
Beiträge: 35
Registriert: 28. Sep 2009 15:48
Wohnort: Darmstadt
Kontaktdaten:

Re: 3. Aufgabenblatt

Beitrag von Martek » 31. Jan 2013 13:02

Ich verstehe leider nicht genau wie die Stacks aufgebaut sein sollen. In den Folien sind stack Frames immer so benutzt, dass Funktionen mit Rückgabewert benutzt werden.

Hier werden aber indirektionen benutzt, was zwar in den Folien steht, aber ich weiß nun nicht genau, wie ich den Parameter auf den Stack speicher. In den Stack, schreibe ich da die Position wie zB LB(0), oder schreibe ich nochmal r auf den Stack, oder wie mache ich das genau?

Gruß
Marcel
Wer aufgehört hat besser zu werden, der hat aufgehört gut zu sein!

LordHoto
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 135
Registriert: 14. Dez 2009 17:00

Re: 3. Aufgabenblatt

Beitrag von LordHoto » 31. Jan 2013 15:09

Martek hat geschrieben:Ich verstehe leider nicht genau wie die Stacks aufgebaut sein sollen. In den Folien sind stack Frames immer so benutzt, dass Funktionen mit Rückgabewert benutzt werden.

Hier werden aber indirektionen benutzt, was zwar in den Folien steht, aber ich weiß nun nicht genau, wie ich den Parameter auf den Stack speicher. In den Stack, schreibe ich da die Position wie zB LB(0), oder schreibe ich nochmal r auf den Stack, oder wie mache ich das genau?
Ich verstehe dein Problem nicht genau. Prozeduren haben ja keine Rückgabewerte in Triangle und nur diese werden in den Folien in Beispielen gezeigt. Außer ich habe etwas übersehen, vllt. kannst du ja mal die Foliennummer verlinken. Danke.

Prinzipiell zu Referenzen: Folien 73/74 bzw. 143/144 in den animierten Folien beschreiben wie es funktioniert. Bei der Übergabe einer Referenz wird die Adresse der Variable auf den Stack geschrieben. Wenn auf eine Referenz zugegriffen wird, wird dann über LOAD und LOADI gelesen bzw. über LOAD und STOREI geschrieben. Das kannst du dir auch in einem kleinen Testprogramm anschaun, dass du durch den Disassembler laufen lässt. Damit sollte eigentlich klar sein, was auf den Stack geschrieben wird.
Compiler 1 Tutor WS 12/13

Martek
Windoof-User
Windoof-User
Beiträge: 35
Registriert: 28. Sep 2009 15:48
Wohnort: Darmstadt
Kontaktdaten:

Re: 3. Aufgabenblatt

Beitrag von Martek » 31. Jan 2013 15:27

Konkret meinte ich Foliensatz 3 - Folie 69 und die darum liegenden. Wenn ich die Folie richtig verstehe ist hier ein ganz normaler Funktionsaufruf abgebildet. Mit return etc. In der Aufgabe handelt es sich aber um prozeduren, was ja anders ist.

Ich war der Meinung dass wir die Zustände von "vor call" und "nach call" jeweils aufmalen sollen. Nur jeweils mit den Bereichen von arguments, local data und result genauer aufgeschlüsselt welche bereiche im Stack genau liegen.

Ich würde dann von oben prinzipiell vor dem ersten Funktionsaufruf folgendes auf den Stack haben:

___________________
|________4________|
|______LB(0)_______|
|_________________| <- ST


und dann durch die Rekursion als nächstes:
(alter Kram ist ja weiterhin im Soecher, deshalb auch kopiert)
___________________
|________4________|
|______LB(0)_______|
|________r________|
|________a________|
|________b________|
|________3________|
|_______LB(0)______|
|_________________| <- ST

Und so weiter. Das werden dann am Ende so ca. 16 einzelne Stackframes (oder mehr)

Entweder ich verstehe die Aufgabe nicht, oder die Folien, sicher bin ich mir da nicht.
Wer aufgehört hat besser zu werden, der hat aufgehört gut zu sein!

LordHoto
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 135
Registriert: 14. Dez 2009 17:00

Re: 3. Aufgabenblatt

Beitrag von LordHoto » 31. Jan 2013 15:46

Martek hat geschrieben:Konkret meinte ich Foliensatz 3 - Folie 69 und die darum liegenden. Wenn ich die Folie richtig verstehe ist hier ein ganz normaler Funktionsaufruf abgebildet. Mit return etc. In der Aufgabe handelt es sich aber um prozeduren, was ja anders ist.
Ich denke du meinst Folienstaz 4, aber ja stimmt, das habe ich übersehen. Das ist die allgemeine Methode, ja. Bei Prozeduren ist es genau so, einzig der Returnwert fehlt. Direkt darauf folgt ja auch ein Beispiel mit Funktionen und Prozeduren wie ich gerade sehe.
Martek hat geschrieben:Ich war der Meinung dass wir die Zustände von "vor call" und "nach call" jeweils aufmalen sollen. Nur jeweils mit den Bereichen von arguments, local data und result genauer aufgeschlüsselt welche bereiche im Stack genau liegen.

Ich würde dann von oben prinzipiell vor dem ersten Funktionsaufruf folgendes auf den Stack haben:

___________________
|________4________|
|______LB(0)_______|
|_________________| <- ST


und dann durch die Rekursion als nächstes:
(alter Kram ist ja weiterhin im Soecher, deshalb auch kopiert)
___________________
|________4________|
|______LB(0)_______|
|________r________|
|________a________|
|________b________|
|________3________|
|_______LB(0)______|
|_________________| <- ST

Und so weiter. Das werden dann am Ende so ca. 16 einzelne Stackframes (oder mehr)

Entweder ich verstehe die Aufgabe nicht, oder die Folien, sicher bin ich mir da nicht.
Da kommen einige Stackframes zusammen, ja. Im Prinzip ist deine Idee schon richtig, was du als Stackcontents zeigst ist aber noch nicht richtig. Du solltest dir nochmal anschaun was alles in einem Stackframe gespeichert ist. Wenn Adressen wie LB(0) oder Variablenwerte bekannt sind, sollten diese direkt eingetragen werden. Das gilt nicht für die Links. Man kann sich überlegen ob das hier für alle Adressen und Variablen möglich ist. Und eine kleine Gegenfrage zur Hilfe: Wieso liegt bei dir "r" auf dem Stack?
Compiler 1 Tutor WS 12/13

Martek
Windoof-User
Windoof-User
Beiträge: 35
Registriert: 28. Sep 2009 15:48
Wohnort: Darmstadt
Kontaktdaten:

Re: 3. Aufgabenblatt

Beitrag von Martek » 31. Jan 2013 16:01

ich hatte bei meiner Zeichnung noch die link data vergessen.

r habe ich tatsächlich übersehen, dass man das nicht braucht, da es ja vom aufrufenden Frame gestellt wird.

Wenn ich die link data rein mache und r wieder raus, ists ja schon nicht schlecht.
Wenn Adressen wie LB(0) oder Variablenwerte bekannt sind, sollten diese direkt eingetragen werden.
Bedeutet das, ich schreibe statt LB(0) einfach n oder wie ist das gemeint?
Wer aufgehört hat besser zu werden, der hat aufgehört gut zu sein!

LordHoto
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 135
Registriert: 14. Dez 2009 17:00

Re: 3. Aufgabenblatt

Beitrag von LordHoto » 31. Jan 2013 16:14

Martek hat geschrieben:ich hatte bei meiner Zeichnung noch die link data vergessen.

r habe ich tatsächlich übersehen, dass man das nicht braucht, da es ja vom aufrufenden Frame gestellt wird.

Wenn ich die link data rein mache und r wieder raus, ists ja schon nicht schlecht.
Wenn Adressen wie LB(0) oder Variablenwerte bekannt sind, sollten diese direkt eingetragen werden.
Bedeutet das, ich schreibe statt LB(0) einfach n oder wie ist das gemeint?
Naja was willst du denn mit LB(0) ausdrücken als "Wert"?
Compiler 1 Tutor WS 12/13

jonas
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 177
Registriert: 5. Okt 2008 21:35
Wohnort: DA

Re: 3. Aufgabenblatt

Beitrag von jonas » 31. Jan 2013 16:34

LB(0) ist ja nur im Kontext eines Stackframes sinnvoll.
Sobald eine weitere Funktion aufgerufen wird, wird ja auch das register LB verändert...

Man könnte statt "LB(0)" direkt die konkrete Adresse angeben - dafür müsste aber eine Startadresse bekannt sein.
Hier wurde in den Folien oft mit "Null" hantiert.

Das Beispiel von Martek wäre dann ergänzt so:

direkt vor mfib(n=4, var n)
: ___________________
0: |______n=4________| <- LB
1: |________4________| | 1. Argument für mfib, Wert von n
2: |__var n = LB(0) = 0_| | 2. Argument für mfib, "var n"
3: |_________________| <- ST


direkt nach dem Aufruf wäre es dann ungefär so:
: ___________________
0: |______n=4________|
1: |________4________| | 1. Argument für mfib, Wert von n
2: |________0________| | 2. Argument für mfib, "var n"
3: |_______X_________| <- LB
4: |_______X_________|
5: |_______X_________|
6: |______a__________| | lokale Variable von mfib, nicht initialisiert
7: |______b__________| | lokale Variable von mfib, nicht initialisiert
8: |_________________| <- ST

Hier wären X die 3 Infos von dem Stackframe (static, dynamic link, return adress)


Ist das dann so gedacht?
Rein von der Systematik wie man es aufschreibt...


Ps: ob Stacktop jetzt auf die erste freie oder auf die letzte belegte zeigt weiß ich gerade nicht genau, ich habs einfach mal von Martek übernommen :-)

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: 3. Aufgabenblatt

Beitrag von Jens Huthmann » 31. Jan 2013 16:42

jonas hat geschrieben:Ist das dann so gedacht?
Rein von der Systematik wie man es aufschreibt...
Ja, so ist das gedacht.

Martek
Windoof-User
Windoof-User
Beiträge: 35
Registriert: 28. Sep 2009 15:48
Wohnort: Darmstadt
Kontaktdaten:

Re: 3. Aufgabenblatt

Beitrag von Martek » 1. Feb 2013 10:16

Noch eine letzte Frage,

so wie es implementiert ist, berechnet mfib(x) nicht die wirkliche Fibonacci Zahl oder? Das Ganze ist ein wenig verschoben, weil zB fib(2) = 3 ist, was aber eigentlich 1 sein sollte oder nicht?

Gewollt, oder nicht gewollt?
Wer aufgehört hat besser zu werden, der hat aufgehört gut zu sein!

LordHoto
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 135
Registriert: 14. Dez 2009 17:00

Re: 3. Aufgabenblatt

Beitrag von LordHoto » 1. Feb 2013 14:41

Martek hat geschrieben:Noch eine letzte Frage,

so wie es implementiert ist, berechnet mfib(x) nicht die wirkliche Fibonacci Zahl oder? Das Ganze ist ein wenig verschoben, weil zB fib(2) = 3 ist, was aber eigentlich 1 sein sollte oder nicht?

Gewollt, oder nicht gewollt?
Das stimmt, sieht aus als wäre da etwas schiefgelaufen. Wahrscheinlich sollte der nicht-rekursive Fall für n < 2 einfach r auf n setzen.

Für die Aufgabe selbst sollte das hoffentlich kein großes Problem sein ;-).
Compiler 1 Tutor WS 12/13

Toa
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 121
Registriert: 16. Feb 2011 23:58

Re: 3. Aufgabenblatt

Beitrag von Toa » 2. Feb 2013 15:48

In welchem Format sind denn diese *.tam files? Wenn ich mit notepad++ für Aufgabe 3.2 den Quellcode als *.tam speichere kann der Disassembler die Datei nicht einlesen. Grüße T0a

Antworten

Zurück zu „Archiv“