Referenz - Eckige Klammern
Die eckigen Klammern können in FreeBASIC für zwei Sprachkonstrukte eingesetzt werden:
- String-Indizierung
- Pointer-Indizierung
- Operator-Überladung
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
[] 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 1.00.0 überladbar.
Siehe auch: Addition und Subtraktion bei Pointern
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|