stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 122

Tag 122 von 365 · Fortgeschritten · Monat 5: Speicher und Struktur

Tabellen im Stack

Eine Tabelle im Stack: Adresse = Anfang + Index. Eine Schleife geht die Einträge durch und bricht ab, sobald sie einen Treffer findet.

Lektion 15 Min. Woche 18

Das lernst du heute

  • Index berechnen
  • Schleife über Einträge
  • Werte suchen

Vor der Hütte steht ein Eingangsspind. Nur Erze dürfen hinein, alles andere soll eine Warnlampe auslösen. Welche Erze erlaubt sind, steht in einer Tabelle im Stack. Der Chip sucht darin nach dem Teil im Fach.

Index berechnen

Eine Tabelle beginnt an einer festen Adresse, dem Anfang. Eintrag Nummer i liegt bei Anfang + i:

define TABELLE 10 # erste Adresse der Tabelle
add adr TABELLE i
get eintrag db adr

Lass die Tabelle nicht bei 0 beginnen, wenn du auch push benutzt. Ein fester Anfang wie 10 oder 400 hält sie vom push-Stapel fern. Und wer später eine zweite Tabelle braucht, legt sie einfach dahinter.

Schleife über die Einträge

Gefüllt wird einmal vor dem Start-Label, mit einer wandernden Adresse:

move adr TABELLE
poke adr EISEN
add adr adr 1
poke adr KUPFER

Gelesen wird in einer Schleife mit Zähler, wie du sie von den Fächern kennst:

move i 0
suche:
bge i ANZAHL fertig        # alle Eintraege durch
add adr TABELLE i
get eintrag db adr
beq teil eintrag gefunden  # Treffer: sofort raus
add i i 1
j suche

Werte suchen

Die Suche oben bricht beim ersten Treffer ab. Das spart Befehle, vor allem bei langen Tabellen. Prefab-Hashes sind ganze Zahlen, deshalb ist der exakte Vergleich mit beq hier richtig. Bei Messwerten wäre er es nicht.

Andere Suchen folgen demselben Muster: das größte Element finden (mit max über alle Einträge), die Position eines Werts merken (i beim Treffer festhalten), zählen, wie oft etwas vorkommt.

Achtung

Eine Schleife über eine lange Tabelle kostet Befehle. Pro Eintrag sind es hier sechs. Bei 128 Befehlen pro Takt passt eine Tabelle mit rund 20 Einträgen noch in einen Takt. Wird sie länger, verteilt sich die Suche auf mehrere Takte. Das ist kein Fehler, aber die Antwort kommt später.

Tipp

Fehlt der Spind, ist teil NaN, und beq findet nie einen Treffer. Mach daraus eine Regel: ohne Spind keine Warnung und kein „erlaubt“.

Schaubild

Der Stack mit Stapelzeiger Platz 0 10 Platz 1 20 Platz 2 30 Platz 3 Platz 4 sp = 3 nächster freier Platz push 40 pop r0 r0 = 30 zuletzt rein, zuerst raus
Die Tabelle beginnt an einer festen Adresse. Eintrag i liegt bei Anfang + i.

Übung

Aufgabe

Der Eingangsspind „Eingang“ (StructureLockerSmall) darf in Fach 0 nur Erze aus der Tabelle bekommen.

  • Füll vor dem Start-Label ab Adresse TABELLE die Hashes von Eisen-, Kupfer-, Gold- und Siliziumerz.
  • Durchsuch die Tabelle nach OccupantHash aus Fach 0 und brich beim Treffer ab.
  • Wandleuchte „Erlaubt“ an, wenn das Teil in der Tabelle steht. Blinklicht „Fremdteil“ an, wenn etwas im Fach liegt, das nicht in der Tabelle steht.
  • Leeres Fach oder fehlender Spind: beide aus.

Hinweise

Hinweis 1

Füllen: move adr TABELLE, dann abwechselnd poke adr … und add adr adr 1.

Hinweis 2

Occupied mit sgtz absichern – NaN wird 0 und darf nie in ein and.

Hinweis 3

Suche: bge i ANZAHL fertig, Adresse berechnen, get, beq teil eintrag gefunden, i erhöhen, zurück.

Quiz

4 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.

Tag abschließen

  • Übung im Simulator bestanden
  • Quiz mit mindestens 60 % bestanden

Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.

Fehler in dieser Lektion melden

Zum Melden bitte anmelden. Anmelden

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall