Referenz - At
Syntax: @ { Variable | Stringkonstante | Prozedur }
Typ: Operator
Kategorie: Operatoren
Der @-Operator 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 auf myArray(7) zurück. 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
SLEEP
Während der Operator bei Strings variabler Länge nicht auf den Inhalt der Zeichenkette zeigt, 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
SCREENRES 320, 200
DIM Tageszeit(2) AS SUB ()
DIM AS INTEGER i
Tageszeit(0) = @Morgen()
Tageszeit(1) = @Mittag()
Tageszeit(2) = @Nacht()
i = INT(RND*3)
Tageszeit(i)()
SLEEP
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
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|