4D v13.4Compiler Direktiven |
|||||||||||||||||||||||
|
4D v13.4
Compiler Direktiven
|
Boolean |
Fester String |
Datum |
Ganzzahl |
Lange Ganzzahl |
Diagramm |
Zeit |
Bild |
Numerisch (oder Zahl) |
Zeiger |
Text |
BLOB |
Es gibt neun verschiedene Typen von Arrays:
Boolean |
Fester Text |
Datum |
Ganzzahl |
Lange Ganzzahl |
Bild |
Zahl |
Zeiger |
Text |
HInweis: Ab 4D Version 11 gibt es keinen Unterschied mehr zwischen Variablen vom Typ alphanumerisch und Text. Es wird empfohlen, den Typ Text zu verwenden.
Im interpretierten Modus kann sich der Datentyp einer Variablen ändern. Das ist möglich, da der Code interpretiert und nicht kompiliert wird. 4D interpretiert jede Anweisung separat und versteht ihren Kontext.
Im kompiliertem Modus ist die Situation anders. Während die Interpretation Zeile für Zeile abläuft, betrachtet der Kompilierungsprozess die Datenbank in ihrer Gesamtheit.
Der Compiler arbeitet folgendermaßen:
Trifft der Compiler auf denselben Variablennamen für zwei unterschiedliche Datentypen, kann er keine Entscheidung treffen. Er muss nämlich, um ein Objekt zu typisieren und eine Speicheradresse zu vergeben, die exakte Kennung dieses Objekts wissen, d.h. Name und Datentyp. Der Compiler erstellt für jede kompilierte Datenbank eine Übersicht, die für jede Variable Name (oder Identifier) und Platzierung (oder Speicheradresse) sowie den gemäß dem Datentyp belegten Platz angibt. Diese Übersicht heißt Symboldatei. In den Einstellungen der Datenbank können Sie festlegen, ob diese Übersicht während dem Kompilieren in Form einer Textdatei angelegt werden soll.
Diese Übersicht wird auch für die automatische Erstellung von Compiler-Methoden verwendet.
Soll der Compiler die Typisierung Ihrer Variablen prüfen oder sie selbst typisieren, ist die Platzierung der Direktiven einfach. Sie können je nach Ihrer Arbeitsweise zwischen zwei Möglichkeiten wählen:
Compiler Direktiven sind in folgenden Fällen sinnvoll:
Außerdem sorgen Compiler Direktiven für eine Verringerung der Kompilierungszeit.
Manchmal kann der Compiler den Datentyp einer Variablen nicht bestimmen. Ist dies der Fall, generiert er eine entsprechende Fehlermeldung.
Es gibt drei Hauptgründe, die den Compiler den Datentyp nicht bestimmen lassen: Mehrfache Datentypen, Zweideutigkeit aufgrund einer gefolgerten Ableitung und keine Möglichkeit zur Bestimmung des Datentyps.
Mehrfache Datentypen
Hat eine Variable in den einzelnen Anweisungen unterschiedliche Datentypen, generiert der Compiler einen Fehler, der leicht zu beheben ist. Der Compiler wählt die zuerst gefundene Variable und weist deren Datentyp wilkürlich dem nächsten Auftreten der gleichnamigen Variablen mit einem anderen Datentyp zu.
In Methode A
Variable:=True
In Methode B
Variable:="Der Mond ist rund"
Zweideutigkeit aufgrund einer gefolgerten Ableitung
In manchen Fällen kann der Compiler anhand des Ablaufs ableiten, dass der Typ des Objekts nicht geeignet ist. In diesem Fall müssen Sie die Variable explizit mit einer Compiler Direktiven typisieren. Es folgt ein Beispiel, das mit Standardwerten für ein aktives Objekt arbeitet:
Sie können in einem Formular für folgende Objekte Standardwerte zuweisen: Combo Boxen, PopUp Menüs, Registerkarten, DropDown Listen, Menü/DropDown Listen und rollbare Bereiche unter Verwendung der Schaltfläche Bearbeiten für die Liste Werte (in der Eigenschaftenliste unter dem Thema Eingabekontrollen). Weitere Informationen dazu finden Sie im Abschnitt Standardwerte des Handbuchs 4D Designmodus. Die Standardwerte werden automatisch in ein Array geladen, das denselben Namen wie das Objekt hat.
Wird das Objekt nicht in einer Methode verwendet, kann der Compiler den Typ eindeutig als Array vom Typ Text ableiten.
Muss jedoch eine Initialisierung der Anzeige durchgeführt werden, könnte die Sequenz folgendermaßen lauten:
Case of
:(Form event=On Load)
MyPopUp:=2
...
End case
In diesem Fall tritt die Zweideutigkeit ein––beim Analysieren der Methoden leitet der Compiler für das Objekt MyPopUp als Datentyp Zahl ab. In diesem Fall ist es notwendig, das Array in der Formular- oder einer Compiler-Methode explizit zu deklarieren:
Case of
:(Form event=On Load)
ARRAY TEXT(MyPopUp;2)
MyPopUp:=2
...
End case
Var1:=5.2(1)
Zeiger:=->Var1(2)
Var2:=Zeiger->(3)
Obwohl (2) den Variablentyp definiert, auf den der Zeiger zeigt, ist der Typ von Var2 nicht festgelegt. Der Compiler erkennt während der Kompilation zwar einen Zeiger, hat jedoch keine Möglichkeit, zu erkennen, auf welchen Variablentyp er zeigt. Deshalb kann er den Datentyp von Var2 nicht ableiten. Hier ist eine Compiler Direktive erforderlich, zum Beispiel C_REAL(Var2).
Befehle mit mehrfacher Syntax
Verwenden Sie eine Variable, der die Funktion Year of zugewiesen wurde, kann die Variable naturgemäß nur vom Typ Datum sein. Die Dinge liegen jedoch nicht immer so einfach. Nehmen wir folgendes Beispiel:
Der Befehl GET FIELD PROPERTIES lässt zwei Syntax-Arten zu:
GET FIELD PROPERTIES(TabelleNum;FeldNum;Typ;Länge;Indiziert)
GET FIELD PROPERTIES(FeldPtr;Typ;Länge;Indiziert)
Bei einem Befehl mit mehrfacher Syntax kann der Compiler nicht erraten, welche Syntax und Parameter Sie gewählt haben. Hier müssen Sie Compiler Direktiven einsetzen, um die im Befehl übergebenen Variablen zu typisieren, wenn diese nicht bereits an anderer Stelle in der Datenbank aufgrund ihrer Verwendung typisiert wurden.
Befehle mit optionalen Parametern mit unterschiedlichen Datentypen
Bei einem Befehl mit mehreren optionalen Parametern mit unterschiedlichen Datentypen kann der Compiler nicht bestimmen, welcher optionale Parameter verwendet wurde. Nehmen wir folgendes Beispiel:
Der Befehl GET LIST ITEM lässt zwei optionale Parameter zu; den ersten als Lange Ganzzahl, den zweiten als Boolean.
Der Befehl kann verwendet werden in Form von:
GET LIST ITEM(Liste;EintragPos;EintragRef;EintragText;Unterliste;Erweitert)
oder in Form von
GET LIST ITEM(Liste;EintragPos;EintragRef;EintragText;Erweitert)
Hier müssen Sie Compiler Direktiven einsetzen, um die im Befehl übergebenen optionalen Variablen zu typisieren, wenn diese nicht bereits an anderer Stelle in der Datenbank aufgrund ihrer Verwendung typisiert wurden.
Über URL aufgerufene Methoden
Schreiben Sie 4D Methoden, die über eine URL aufgerufen werden müssen und verwenden Sie nicht $1 in der Methode, müssen Sie die Textvariable $1 explizit mit folgender Sequenz deklarieren:
C_TEXT($1)
In der Tat kann der Compiler nicht feststellen, ob die 4D Methode über eine URL aufgerufen wird.
Sind alle in der Datenbank vorkommenden Variablen explizit deklariert, muss der Compiler die Typisierung nicht überprüfen. In diesem Fall können Sie in den Einstellungen der Datenbank definieren, dass der Compiler nur die Übersetzung der Methode vornimmt. Das spart mindestens 50% an Zeit für die Kompilierung.
Über Compiler Direktiven können Sie Ihre Methoden beschleunigen. Weitere Informationen dazu finden Sie im Abschnitt Tipps zur Optimierung. Nehmen wir an, Sie müssen einen Zähler über eine lokale Variable erhöhen. Deklarieren Sie die Variable nicht, geht der Compiler vom Typ Zahl aus. Deklarieren Sie die Variable als Lange Ganzzahl, arbeitet die kompilierte Datenbank effizienter. Auf einem Rechner beansprucht der Typ Zahl 8 Bytes, deklarieren Sie den Zähler als Lange Ganzzahl, benötigt er nur 4 Bytes. Das Hochzählen eines 8-Byte Zählers dauert also länger als das eines 4-Byte Zählers.
Compiler Direktiven lassen sich auf zwei Arten verwalten, je nachdem ob der Compiler Ihre Variablen typisieren soll oder nicht.
4D kennt drei Variablentypen:
Weitere Informationen dazu finden Sie im Abschnitt Variablen. Prozess- und Interprozessvariablen sind von der Struktur her dasselbe für den Compiler.
Da der Compiler nicht den Prozess bestimmen kann, in welchem die Variable verwendet wird, sollten Sie Prozessvariablen mit mehr Bedacht als Interprozessvariablen verwenden. Alle Prozessvariablen werden systematisch dupliziert, wenn ein neuer Prozess beginnt. Eine Prozessvariable kann in jedem Prozess einen anderen Wert haben, sie ist dagegen für die gesamte Datenbank vom gleichen Typ.
Soll der Compiler Ihre Typisierung nicht prüfen, müssen Sie ihm einen Code vorgeben, um die Compiler Direktiven zu identifizieren.
Die Konvention ist folgende:
Compiler Direktiven für Prozess- und Interprozessvariablen und die Parameter sollten in einer oder mehreren Methoden gesetzt werden. Ihr Name muss mit dem Schlüsselwort Compiler beginnen.
Sie können mit dem Compiler standardmäßig fünf Arten von Compilermethoden generieren. Das sind die Direktiven für Variablen, Arrays und Methodenparameter. Weitere Informationen dazu finden Sie im Abschnitt Compilermethoden für ... des Handbuchs 4D Designmodus.
Hinweis: Die Syntax zum Deklarieren dieser Parameter lautet:
Direktive (MethodenName;Parameter). Sie lässt sich nicht im interpretierten Modus ausführen.
Besondere Parameter
C_LONGINT($0)
If(Form event=On Drag Over)
$0:=0
...
If($DataType=Is Picture)
$0:=-1
End if
...
End if
Der Befehl C_STRING verwendet eine andere Syntax als die anderen Direktiven, da er zusätzlich den Parameter max. Stringlänge zulässt.
C_STRING(Länge;Var1{;Var2;…;VarN})
Da C_STRING Strings mit fester Länge typisiert, geben Sie die max. Länge solcher Strings an. In einer kompilierten Datenbank müssen Sie die Länge des String mit einer Konstanten anstelle einer Variablen angeben.
In einer interpretierten Datenbank ist folgende Sequenz zulässig:
TheLength:=15
C_STRING(TheLength;TheString)
4D interpretiert TheLength und ersetzt dies durch deren Wert in der Compiler Direktive C_STRING.
Der Compiler benützt diesen Befehl jedoch beim Typisieren von Variablen ohne Beachten einer spezifischen Zuweisung. Da der Compiler nicht weiss, dass TheLength gleich 15 ist, kann er in der Symboldatei dafür keinen Platz bewahren. Deshalb sollten Sie im Hinblick auf die Kompilierung die Länge in einer Konstanten festlegen. Sie können zum Beispiel schreiben:
C_STRING(15;TheString)
Dieselbe Regel gilt für Arrays mit fester Länge, hier schreiben Sie folgende Anweisung:
ARRAY STRING(length;arrayName;size)
Der Parameter für die Länge des String im Array muss eine Konstante sein.
Sie können die Länge des String dagegen mit einer 4D Konstanten oder einem hexadezimalen Wert in den beiden folgenden Compiler Direktiven angeben. Zum Beispiel:
C_STRING(4DConstant;TheString)
ARRAY STRING(4DConstant;TheArray;2)
C_STRING(0x000A;TheString)
ARRAY STRING(0x000A;TheArray;2)
Verwechseln Sie nicht die Länge eines alphanumerischen Feldes, das max. 80 Zeichen zulässt, mit einer Variablen mit festem String. Die max. Länge eines String, der in einer C_STRING Direktiven deklariert wurde oder zu einem ARRAY STRING gehört, liegt zwischen 1 und 255.
Hinweis: Mit der Syntax dieses Befehls können Sie verschiedene Variablen mit derselben Länge in einer einzelnen Zeile deklarieren. Wollen Sie mehrere Strings unterschiedlicher Länge deklarieren, führen Sie das in separaten Zeilen aus.
Compiler Direktiven entfernen jede Zweideutigkeit bei Datentypen. Auch wenn eine gewisse Striktheit notwendig ist, muss das nicht heißen, dass der Compiler überhaupt keine Inkonsistenz toleriert.
Weisen Sie zum Beispiel einer Variablen, die als Ganzzahl deklariert wurde, einen Wert vom Typ Zahl zu, sieht der Compiler keinen Typkonflikt und weist die Werte gemäß Ihren Direktiven zu. Wenn Sie also schreiben:
C_INTEGER(vInteger)
vInteger:=2.5
betrachtet der Compiler das nicht als Konflikt des Datentyps, der eine Kompilierung verhindert; vielmehr rundet er einfach auf den nächstgelegenen Wert auf (3 anstatt 2.5).
Produkt: 4D
Thema: Compiler
Einzelheiten zur Syntax
Fehlermeldungen
Richtlinien zur Typisierung
Tipps zur Optimierung