Eckige Klammern

FreeBASIC-Referenz » Operatoren in FreeBASIC » Eckige Klammern

Die eckigen Klammern können in FreeBASIC für zwei Sprachkonstrukte eingesetzt werden:



String-Indizierung
Syntax: Stringvariable[Index]
Der Stringindizierungs-Operator [ ] ermöglicht es dem Programmmierer, einzelne Zeichen eines Strings über einen Index anzusprechen; dabei ist Lese- und Schreibzugriff möglich. Für STRINGs, ZSTRINGs fester Länge und WSTRINGs fester Länge ist der Rückgabewert der ASCII-Code des indizierten Zeichens. Der Programmierer muss sicherstellen, dass die Indizes von 0 bis LEN(Stringvariable)-1 reichen; andernfalls können die Ergebnisse nicht vorhergesagt werden, da ein Zugriff auf Speicherbereiche auftritt, der nicht mehr zur STRING-Variable gehört, evtl. sogar nicht mehr zum Speicherbereich des laufenden Programms.

Beispiel:

DIM txt AS STRING = "Hallo, world!"
DIM i AS INTEGER
txt[1] = 101  ' im zweiten Buchstaben a durch e tauschen
FOR i = 0 TO LEN(txt) - 1
  PRINT CHR(txt[i]);
NEXT
SLEEP

Ausgabe:

Hello, World!



Pointerindizierung
Syntax: Pointer[index]
Die Pointerindizierung ermöglicht mittels eines Index den Zugriff auf eine Adresse relativ zur Adresse, auf die der Pointer zeigt. Die Adresse im Speicher, auf die tatsächlich zugegriffen wird, errechnet sich nach:

Adresse = Pointer + index * SIZEOF(*Pointer)

Der Pointer wird dabei nicht verändert. Der Programmierer muss selbst sicherstellen, dass der Pointer auf eine sinnvolle Adresse zeigt.

Beispiel:

DIM a(10) AS INTEGER
DIM pa AS INTEGER PTR

FOR i AS INtEGER = 0 To 10
  ' Das Array mit den Werten von 0 bis 10 befüllen
  a(i) = i
NEXT i
pa = @a(0)

' Den Inhalt des Arrays ausgeben:
FOR i AS INTEGER = 0 TO 10
  PRINT pa[i]
NEXT i
SLEEP

Ausgabe:

 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10

Operator-Überladung
Seit FreeBASIC 0.91 lässt sich [] als Operator innerhalb von eigenen Types überladen.

Beispiel:

Type StringWrapper
    As String s

    Declare Operator [] (ByVal index As Integer) ByRef As UByte
End Type

Operator StringWrapper.[] (ByVal index As Integer) ByRef As UByte
    Return s[index]
End Operator

Dim As String foo = "foo"

Dim As StringWrapper sw
sw.s = "foo"

Print foo[0], foo[1], foo[2]
Print sw[0],  sw[1],  sw[2]
Sleep

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: Der Indexoperator [] ist seit FreeBASIC 0.91.0 überladbar.

Siehe auch: Addition und Subtraktion bei Pointern