At

FreeBASIC-Referenz » Operatoren in FreeBASIC » At

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