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ühl­bar.

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-Schwester­befehle 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.