Wer Arrays in MMBasic auf einen Anfangswert setzt, schreibt erstmal das Offensichtliche:
DIM INTEGER aactive(199)
FOR i = 0 TO 199
aactive(i) = 0
NEXT i
Funktioniert. Ist aber unnötig, weil MMBasic die Vektor-Variante seit längerem mitbringt: MATH SET. Eine Zeile, gleicher Effekt, intern in C ausgeführt statt durch den BASIC-Interpreter.
MATH SET 0, aactive()
Das Argument ist der Wert, danach das Ziel-Array. Funktioniert für INTEGER und FLOAT, ein- und mehrdimensional, sofern das Array vorher mit DIM angelegt wurde.
Wo es bei mir richtig was bringt
Beim Spiel-Reset sind es bei mir vier Pool-Arrays, die alle auf 0 müssen, plus ein paar Werte-Arrays:
SUB ResetGame()
MATH SET 0, aactive()
MATH SET 0, pactive()
MATH SET 0, shot_active()
MATH SET 0, ufo_shot_active()
' ...
END SUB
Vor MATH SET waren das vier verschachtelte FOR-Schleifen oder eine mit i = 0 TO 199 und mehreren Zuweisungen. Code wirkt jetzt wie eine Aufzählung von Absichten, statt wie Zähler-Lyrik. Im Hot-Path eines Spiels steht das nicht, aber beim Spielstart oder Level-Wechsel ist der Zeitvorteil mess- und im Code-Flow fühlbar.
Andere Werte als 0
Nicht nur Nullsetzen, jeder Wert geht. Etwa wenn man Highscore-Plätze auf -1 vorbelegen will:
DIM INTEGER hs_levels(9)
MATH SET -1, hs_levels()
Oder einen Float-Buffer auf einen Anfangswert:
DIM FLOAT distances(99)
MATH SET 9999.0, distances()
Das ist genau der „leerer Speicher mit Sentinel-Wert"-Pattern, ohne dass man dafür zwei Zeilen und einen Schleifenzähler braucht.
Auch für mehrdimensionale Arrays
MATH SET füllt das ganze Array, egal wie viele Dimensionen. Bei mir ein Vertex-Cache mit 200×16 Floats, einmal MATH SET 0, ... und alles ist auf 0:
DIM FLOAT vert_x(199, 15)
MATH SET 0, vert_x()
Mit FOR-Schleifen wären das zwei verschachtelte Iterationen über je 200 und 16 Elemente.
Verwandte Befehle
Wenn MATH SET einmal in Fleisch und Blut übergegangen ist, fallen die anderen MATH-Schwesterbefehle leichter ins Auge: MATH ADD für Skalar-Addition über ein ganzes Array, MATH SCALE für Multiplikation mit einem Skalar, MATH SLICE zum Rausziehen einer Zeile. Alle nach demselben Schema, alle ersetzen FOR-Schleifen, alle laufen schneller.
In MMBasic auf CMM2 oder MMB4L lohnt es deshalb, vor jeder Array-Schleife kurz zu überlegen, ob MATH … schon das passende Werkzeug hat. Häufiger als ich am Anfang gedacht habe.