Syntax: @ { Variable | Stringkonstante | Prozedur }
Typ: Operator
Kategorie: Speicherverwaltung
Dieser Opterator gibt die Adresse seines Operanden zurück. @ kann anstelle jeder beliebigen FB-eigenen xxxPTR-Funktion benutzt werden (abgesehen von STRPTR bzw. SADD).
Wenn der @-Operator mit einem String variabler Länge benutzt wird, gibt er einen Pointer auf den internen STRING-Bezeichner zurück. Benutzen Sie STRPTR oder SADD, um die Adresse der eigentlichen Zeichen zu erhalten. Siehe auch STRING (Datentyp) für Informationen zum STRING-Bezeichner bzw. dem internen Management von Zeichenketten.
Wenn dieser Operator mit einem Array verwendet wird, gibt er einen Pointer auf das per Index angegebene Element des Arrays zurück. Beispielsweise gibt
@myArray(7)
einen Pointer zurück auf myArray(7). Um einen Pointer auf den Beginn eines Arrays zu erhalten, geben Sie den niedrigsten Index an (siehe LBOUND).
@ kann mithilfe von OPERATOR überladen werden.
Beispiel 1:
DIM AS INTEGER a, b
DIM AS INTEGER PTR addr
a = 5
b = 10
PRINT "Der Wert von a ist ";a;
PRINT "; er ist gespeichert an Adresse ";@a
PRINT "Der Wert von b ist ";b;
PRINT "; er ist gespeichert an Adresse ";@b
' Die Adresse von a wird jetzt in dem
' INTEGER PTR gespeichert:
addr = @a
PRINT "Der Pointer addr zeigt jetzt auf a."
PRINT "Der Wert von a kann mit dem Pointer"
PRINT "ermittelt werden: ";*addr
Während dieser Operator mit Strings variabler Länge falsche Adressen zurückgibt, kann er bei Stringkonstanten angewandt werden.
Beispiel 2:
DIM AS ZSTRING PTR YesNoMaybe(2) => { _
@"ja", @"nein", @"vielleicht" }
DIM AS INTEGER i
PRINT "Standard-Liebesbrief v7.23"
PRINT
PRINT "Willst du mit mir gehen?"
PRINT
FOR i = 0 TO 2
PRINT i; ")", *YesNoMaybe(i)
NEXT
DO
i = VAL(INPUT(1))
LOOP UNTIL i < 3
PRINT
PRINT "Du hast "; *YesNoMaybe(i); " gesagt."
SLEEP
Möglich ist auch die Verwendung dieses Operators mit Prozeduren:
DECLARE SUB Morgen ()
DECLARE SUB Mittag ()
DECLARE SUB Nacht ()
RANDOMIZE TIMER
SCREENRES 320, 200
DIM Tageszeit(2) AS SUB ()
DIM AS INTEGER i
Tageszeit(0) = @Morgen()
Tageszeit(1) = @Mittag()
Tageszeit(2) = @Nacht()
i = RND * 3
Tageszeit(i)()
GETKEY
SUB Morgen ()
PAINT ( 0, 0), 176
CIRCLE (100, 120), 50, 42, , , , F
CIRCLE ( 50, 199), 200, 192, , , .5, F
CIRCLE (319, 199), 100, 195, , , .3, F
END SUB
SUB Mittag ()
PAINT ( 0, 0), 53
CIRCLE (170, 60), 50, 44, , , , F
CIRCLE ( 50, 199), 200, 120, , , .5, F
CIRCLE (319, 199), 100, 123, , , .3, F
END SUB
SUB Nacht ()
PAINT ( 0, 0), 0
DIM AS INTEGER i
FOR i = 0 TO 200
PSET (RND * 320, RND * 200), 31
NEXT
CIRCLE (170, 40), 30, 27, , , , F
FOR i = 0 TO 10
CIRCLE ( COS( 6.28 * i / 5 ) * RND * 23 + 170, _
SIN ( 6.28 * i / 5 ) * RND * 23 + 40 ), RND * _
2 + 3, 23, , , , F
NEXT
CIRCLE ( 50, 199), 200, 240, , , .5, F
CIRCLE (319, 199), 100, 243, , , .3, F
END SUB
Die Verwendung mit Prozeduren stellt auch die Grundlage für Callbacks dar.
Unterschiede zu QB: neu in FreeBASIC
Siehe auch:
* (Wert von), [ ] (Pointer-Indizierung), Pfeil, VARPTR, PROCPTR, STRPTR, SADD, Pointer