Variablen-Typen und Typbindung der Variablen
Unterstützte Variablen-Typen
Xbase++ kennt in den Speichervariablen keine Typ-Bindung, d.h. einer Variablen kann jeder Wert, unabhängig vom Typ, zugewiesen werden.
Felder in Dateien hingegen sind eindeutig typgebunden, und die Übertragung eines nicht kompatiblen Wertes führt beim Schreiben in die Datei zu einem Laufzeitfehler.
Xbase++ unterstützt die folgenden Variablen-Typen:
ARRAY
Ein Array ist eine Gruppierung von Variablen, die unterschiedliche Typen haben können.
nCount := fCount() aRec := Array(nCount) FOR nI := 1 TO nCount aRec[nI] := FieldGet(nI) NEXT
In diesem Beispiel wird ein Array verwendet, um die Felder eines Datensatzes aufzunehmen. Zu diesem Zweck wird die Feldanzahl über die Funktion fCount() ermittelt und mittels der Funktion Array() ein leeres Array mit nCount Feldern erzeugt. Jedes Element des Arrays hat den Wert NIL. Danach wird in einer Schleife jedes Feld entsprechend seiner Position im Datensatz in das korrespondierende Array-Element übertragen.
Arrays können auch geschachtelt sein, d.h. ein Array-Element kann auch wieder ein eigenes Array sein.
BLOCK oder Codeblock
Ein Codeblock enthält zur Compile- oder Laufzeit erzeugten Code, der eigenständig im Programmkontext ausführbar ist.
bBlock := {|| Time()} ? Eval(bBlock)
Bei der Ausführung des Codeblocks über die Funktion Eval() wird die aktuelle Zeit ausgegeben.
CHAR oder Zeichen/String
Hierunter fallen alle alpha- und numerischen Zeichen incl. binärer Werte.
Wenn ein Memo-Feld aus einer Datei einer Speichervariablen zugewiesen wird, hat die Speichervariable den Feldtyp CHAR.
cName := "Felix Hugendabler" cName := Str(27)
DATE oder Datum
Xbase++ unterstützt Datumswerte im Bereich von " . . " (= leer), "01.01.0001" bis "31.12.9999". Datumsfelder können auch in arithmetischen Operationen verwendet werden:
dDate := Date() // weist das aktuelle Datum zu dGestern := dDate - 1 // ermittelt das Datum des Vortages nDauer := dDate - dGestern // ermittelt die Tage zwischen dDate und dGestern
LOGICAL oder logisch
Logische Werte kennen .T. (WAHR) und .F. (FALSCH).
lErgebnis := .T. lErgebnis := 1 > 3
NUM oder Zahlen
Darstellbar am Bildschirm sind Zahlen im Bereich von 16 Vor- und 15 Nachkommastellen, also insgesamt maximal 31 Ziffern. Intern operiert Xbase++ mit IEEE 64 bit format Zahlen.
Zuweisungen können dezimal, hexadezimal oder wissenschaftlich erfolgen, wobei zu berücksichtigen ist, dass für dezimale Werte ein Dezimalpunkt zu verwenden ist:
nWert := -176.33 nWert := 0xAD nWert := 10.1E-5
OBJECT oder Objekt
Ein Objekt ist ein spezieller Datentype, der als Container wiederum Variablen und Programmcode enthalten kann. Variablen, die sich auf Objekte beziehen, enthalten immer nur eine Referenz auf das Objekt, nicht jedoch das Objekt selbst.
oXbp := XbpDialog():new()
NIL
Deklarierte, aber nicht initialisierte Variablen haben im Normalfall den Wert NIL.
Übersicht über die Feldtypen, Grössen und Wertebereiche
Typ | Länge von bis | Wertebereich |
---|---|---|
ARRAY | (nicht explizit) | (beliebig) |
BLOCK | (nicht explizit) | n/a |
CHAR | 1 bis 32767 Bytes | alphanumerisch incl. binär |
DATE | 8 bzw. 10 Bytes | leer und gültige Datumswerte von 1.1.1 bis 31.12.9999 |
LOGIC | 1 Byte | WAHR und FALSCH |
NUMERIC | 1 bis 16.15 | 10**-308 bis 10**308 |
OBJECT | (nicht explizit) | n/a |
Besonderheiten
Arrays
Während der Inhalt einer Variablen mittels der Zuweisung einer weiteren Variablen zugewiesen werden kann, ist dies bei Arrays nicht möglich.
dHeute := Date() dDatum := dHeute dHeute := NIL ? dDatum
Hier wird als Ergebnis das Tagesdatum ausgegeben.
aData := Array(1) aData[1] := Date() aWerte := aData aWerte := NIL ? aData
Hier wird als Ergebnis NIL ausgegeben.
Die Zuweisung aWerte := aData kopiert nicht das Array, sondern die Referenz auf das Array, so dass beide Variablen auf das gleiche Array zeigen. Die Zuweisung von NIL an aWerte betrifft das Array, auf das aData Bezug nimmt, ebenso.
Um Arrays zu kopieren, muss die Funktion AClone() verwendet werden:
aData := Array(1) aData[1] := Date() aWerte := AClone(aData) aWerte := NIL ? aData
Diesmal wird als Ergebnis {(Tagesdatum)} ausgegeben.