Skip to content
Raven edited this page Jun 4, 2019 · 4 revisions

Variablen und Funktion

Für das Definieren/Benutzen von Variablen und Funktionen gibt es die folgenden Makros

Makro-Name Argumente Beschreibung Preprocessed Format Bemerkung
GVAR name Baut den Namen einer globalen Variable zusammen <ModName>_<ModulName>_<name>
DFUNC name Baut den Namen einer Funktion zusammen <ModName>_<ModuleName>_fnc_<name>
FUNC name Baut den Namen einer Funktion zusammen und führt ggf. einen check aus, ob diese Funktion existiert <ModName>_<ModuleName>_fnc_<name> Der Check (aktiviert in der Dev-Version) führt zu Fehlern, wenn man versucht, via FUNC variablen zuzuweisen
CFUNC name Baut den Namen einer CLib-API-Funktion zusammen (führt Checks aus) CLib_fnc_<name> Bezüglich Checks gilt das bereits Gesagte
OFUNC name Baut den Namen einer OPT-API-Funktion zusammen (führt Checks aus) OPT_fnc_<name> Bezüglich Checks gilt das bereits Gesagte

Für jedes dieser Makros gibt es noch eine "Q-Variante" (z.B. QGVAR, die das selbe macht, aber das Ergebnis als String zurückliefert (also in Anführungszeichen verpackt)). Das ist für Operationen mit setVariable, etc. sehr nützlich.

Wichtig: Um inline-Funktionen zu definieren, darf ausschließlich das DFUNC-Makro verwendet werden.

Assertions

Für eine detaillierte Beschreibung, was es mit dem Konzept der Assertions auf sich hat, siehe https://de.wikipedia.org/wiki/Assertion_(Informatik). Kurz gesagt, lassen sich damit einige Checks in den Code einbauen, die einen Fehler loggen, wenn sie fehlschlagen. DIes kann dabei helfen die Ursache für irgendwelche Bugs zu finden oder überhaupt frühzeitig zu erkennen, dass etwas nicht so läuft, wie es sollte.

Aktuell existieren einige ASSERT_IS_XYZ-Makros, die überprüfen, ob eine übergebene Variable vom Datentyp XYZ ist. Wenn ja, dann passiert nichts weiter und wenn nein, dann wird ein entsprechender Fehler geloggt.

Wichtig: Alle Assertions werden nur dann ausgeführt, wenn das ISDEV-Makro definiert wurde. Das heißt, dass die Assertions nur in der Entwicklerversion (Dev-Version) der Mod ausgeführt werden. Andernfalls können sie aber trotzdem im Code stehen. Sie werden durch den Preprocessor aber durch einen leeren String ersetzt.

Makro-Name Argumente Beschreibung Bemerkung
ASSERT_IS_TYPE var,type Überprüft, ob var vom selben Datentyp, wie type ist Überprüft wird var isEqualType type
ASSERT_IS_ARRAY var Überprüft, ob var vom Type Array ist
ASSERT_IS_BOOL var Überprüft, ob var vom Typ Boolean ist
ASSERT_IS_CODE var Überprüft, ob var vom Typ Code ist
ASSERT_IS_CONFIG var Überprüft, ob var vom Typ Config ist
ASSERT_IS_CONTROL var Überprüft, ob var vom Typ Control ist
ASSERT_IS_DISPLAY var Überprüft, ob var vom Typ Display ist
ASSERT_IS_GROUP var Überprüft, ob var vom Typ Group ist
ASSERT_IS_OBJECT var Überprüft, ob var vom Typ Object ist
ASSERT_IS_SCALAR var Überprüft, ob var vom Typ Scalar ist Number und Scalar ist das Gleiche
ASSERT_IS_NUMBER var Überprüft, ob var vom Typ Number ist Number und Scalar ist das Gleiche
ASSERT_IS_SCRIPT var Überprüft, ob var vom Typ Script ist
ASSERT_IS_SIDE var Überprüft, ob var vom Typ Side ist
ASSERT_IS_STRING var Überprüft, ob var vom Typ String ist
ASSERT_IS_TEXT var Überprüft, ob var vom Typ Text ist "Text" wird auch oft als "Structured Text" bezeichnet
ASSERT_IS_LOCATION var Überprüft, ob var vom Typ Location ist
ASSERT_IS_NAMESPACE var Überprüft, ob var vom Typ Namespace ist
ASSERT_IS_NULL var Überprüft, ob var vom Typ Null ist Achtung: NULL != NIL
ASSERT_IS_NOT_NULL var Überprüft, dass var nicht vom Typ Null ist
ASSERT_IS_NIL var Überprüft, ob var undefiniert ist
ASSERT_IS_NOT_NIL var Überprüft, dass var nicht* undefiniert ist
ASSERT_IS_POSITION var Überprüft, ob var vom Typ Position ist Eine Position ist entweder Position2D oder Position3D
ASSERT_IS_POSITION2D var Überprüft, ob var vom Typ Position2D ist Position2D == Zahlenarray der Länge zwei
ASSERT_IS_POSITION3D var Überprüft, ob var vom Typ Position3D ist Position3D == Zahlenarray der Länge drei
ASSERT_IS_INTEGER var Überprüft, ob var ein Integer ist Integer == Ganzzahl
ASSERT_TRUE var Überprüft, dass var true zurück gibt
ASSERT_FALSE var Überprüft, dass var false zurück gibt
ASSERT_ARRAY_LENGTH var,length Überprüft, dass var ein Array der Länge length ist Das Testen auf mehrere Längen ist hiermit nicht möglich
ASSERT_ALIVE var Überprüft, ob alive var true zurück gibt Kann nur auf Objekte angewendet werden
ASSERT_DEAD var Überprüft, ob alive var false zurück gibt Kann nur auf Objekte angewendet werden

Benutzt werden könnte das Beispielsweise in diesem Kontext:

params ["_myString", "_myNumber", "_myObject"];
ASSERT_IS_STRING(_myString);
ASSERT_IS_NUMBER(_myNumber);
ASSERT_IS_OBJECT(_myObject);

Vorteil gegenüber dem TypenCheck von params

Auch via params lassen sich direkt beim Zuweisen der Variablen deren Typ überprüfen. Der Nachteil gegenüber der Assert-Methode ist jedoch, dass diese Prüfung dann zwangsläufig immer den entsprechenden Overhead mit sich bringt, wohingegen die Makro-Variante "abschaltbar" ist, sodass der gesamte Overhead verschwunden ist.