Referenz - ZSTRING
Typ: Datentyp
Ein ZSTRING ist eine Zeichenkette, die einen zusammenhängenden Text, einzelne Wörter, Buchstaben oder sonstige Zeichen enthalten kann; auch Leerstrings (also Strings ohne jeglichen Inhalt) sind möglich.
Was unterscheidet STRING und ZSTRING?
STRING- und ZSTRING-Variablen eignen sich beide zur Speicherung von Zeichenketten, also Abfolgen von Buchstaben, Zahlen, Satz- und Sonderzeichen. Arithmetische Operationen (z. B. Substraktion) sind auf sie nicht anwendbar.
Der Unterschied zwischen den beiden Datentypen liegt darin, wie die Länge der gespeicherten Zeichenkette festgelegt wird. Anders als elementare Datentypen wie INTEGER, DOUBLE etc., die jeweils eine genau bestimmte und immer gleiche Anzahl an Bytes im Speicher belegen, können (Z-)Strings praktisch nahezu beliebig lang sein.
Ein FreeBASIC-Programm könnte zum Beispiel sowohl die Zeichenkette "Fest gemauert" als auch das gesamte Lied von der Glocke, das mit diesen Worten beginnt, speichern. Woher weiß das Programm nun aber, wo im Speicher die Zeichenkette aufhört und etwas anderes (zum Beispiel eine andere Zeichenkette) beginnt? Hinter der vom Benutzer angegebenen String-Variable verbirgt sich nämlich intern im Hintergrund zunächst nur die Information, wo die Zeichenkette im Speicher anfängt, ein Zeiger auf ihren Beginn also.
Um nun eindeutig bestimmen zu können, wie lang die Zeichenkette ist, gibt es in FreeBASIC zwei Ansätze:
- Man speichert - für den Nutzer unsichtbar - vor dem Anfang jedes Strings eine Zahl mit fester Speicherlänge, die Aufschluss darüber gibt, wie viele Stringbytes auf sie folgen:
- (006) WETTER
- (013) WETTERBERICHT
- Alternativ ist es möglich, am Ende der Zeichenkette eine Stopp-Markierung anzuhängen, statt die Länge als Zahl zu speichern. Das Programm liest also, von der Anfangsadresse des Strings an, so lange weiter, bis diese Stopp-Markierung gefunden wurde:
- WETTERBERICHT<STOP>
Der Nachteil der Längenkennzeichnungsmethode der ZSTRINGs besteht darin, dass CHR(0), also die Stopp-Markierung, niemals in den Zeichenkettendaten auftauchen darf. Taucht die Stopp-Markierung CHR(0) dennoch in den Daten auf (z.B. HALLO <CHR(0)> WELT), so wird die Zeichenkette genau an dieser Stelle abgeschnitten. Im soeben eingeführten Beispiel bliebe also nur "HALLO" übrig. Daten, die Nullbytes enthalten, können mit ZSTRINGs daher nicht gespeichert werden.
Wird einer ZSTRING-Variablen ein Wert zugewiesen, wird automatisch das abschließende Nullzeichen angehängt.
Dies muss beachtet werden, wenn Speicherplatz für einen ZSTRING reserviert wird, da auch das abschließende Nullzeichen ein Byte belegt.
Ein ZSTRING kann auch als ein UBYTE-Array (siehe DIM) betrachtet werden. Dabei ist es möglich, dieses Array statisch zu behandeln; der ZSTRING ist dann fixed length (siehe zu fixed length auch STRING (Datentyp)). Alternativ kann er auch wie ein dynamisches Array gehandhabt werden; die Speicherverwaltung liegt dann jedoch ganz in den Händen des Benutzers. Im Gegensatz zu 'klassischen' Arrays geschieht eine Redimensionierung nämlich nicht über REDIM, sondern über REALLOCATE.
Werden fixed-length-ZSTRINGs verwendet, so verhindert FreeBASIC automatisch einen Overflow, indem es Zeichenketten automatisch abschneidet, wenn sie länger sind als der zur Verfügung stehende Speicherbereich. Bei einem ZSTRING POINTER muss allerdings selbstständig darauf geachtet werden.
ZSTRINGs werden sehr häufig bei der Übergabe von Strings an oder von externen SUBs/FUNCTIONs benutzt. Dieser Typ wurde bereitgestellt, um einen einfachen Umgang mit C-Bibliotheken zu gewährleisten und um die fixed-length-Strings zu ersetzen, die nicht als Pointer verwendet werden können.
Beispiel:
' Bereite einen normalen STRING, einen ZSTRING fester Länge (statisches Array)
' und einen ZSTRING PTR (dynamisches Array) vor
DIM AS STRING nstr
DIM AS ZSTRING * 11 zstr
' später sollen 10 Zeichen gespeichert werden. Zusätzlich
' muss Platz für ein null-zeichen bereitgehalten werden.
DIM AS ZSTRING PTR zstrp
' Befülle jeden Stringtyp mit der Zeichenkette "hello".
nstr = "hello"
zstr = "hello"
zstrp = CALLOCATE(6) ' Da dieser ein Pointer ist, muss
' zuerst der Speicherbereich
*zstrp = "hello" ' für fünf Zeichen + ein Nullzeichen
' reserviert werden.
' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nstr :", nstr
PRINT "zstr :", zstr
PRINT "zstrp :", zstrp
PRINT "*zstrp:", *zstrp
PRINT
' Die Länge der Stringtypen ausgeben
PRINT "LEN(x)"
PRINT "nstr :", LEN(nstr )
PRINT "zstr :", LEN(zstr )
PRINT "zstrp :", LEN(zstrp )
PRINT "*zstrp:", LEN(*zstrp)
PRINT
' Die Größe der Speicherstruktur ausgeben
PRINT "SIZEOF(x)"
PRINT "nstr :", SIZEOF(nstr )
PRINT "zstr :", SIZEOF(zstr )
PRINT "zstrp :", SIZEOF(zstrp )
PRINT "*zstrp:", SIZEOF(*zstrp)
PRINT
' die Zeichenkette " Welt" an die Stringtypen anhängen
nstr &= " Welt" ' FreeBASIC verwaltet den Speicher für
' normale Strings automatisch
zstr &= " Welt" ' da dieser ZString fixed length ist,
' muss kein zusätzlicher Speicher re-
' serviert werden. Da nur 11 Bytes re-
' serviert wurden, ist 'zstr' jetzt
' voll, eine längere Zeichenkette kann
' nicht gespeichert werden.
zstrp = REALLOCATE(zstrp, 12) ' zusätzlichen Speicher re-
' servieren, um die Zeichen-
' kette anhängen zu können,
' und dabei das Nullzeichen
' beachten.
*zstrp &= " Welt" ' jetzt kann auch hier ganz normal ver-
' fahren werden.
' ein einzelnes Zeichen austauschen:
nstr [1] = 97 ' benutze String-Indizierung: Tausche
' das zweite Zeichen durch
zstr [1] = 97 ' CHR(97) aus - ein kleines a.
zstrp[1] = 97 ' funktioniert problemlos bei allen
' Typen.
' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nstr :", nstr
PRINT "zstr :", zstr
PRINT "zstrp :", zstrp
PRINT "*zstrp:", *zstrp
PRINT
' nicht vergessen: Den Speicher wieder freigeben:
DEALLOCATE zstrp
SLEEP
Ausgabe:
Inhalte:
nstr : hello
zstr : hello
zstrp : 3291152
*zstrp: hello
LEN(x)
nstr : 5
zstr : 5
zstrp : 4
*zstrp: 5
SIZEOF(x)
nstr : 12
zstr : 11
zstrp : 4
*zstrp: 0
Inhalte:
nstr : hallo Welt
zstr : hallo Welt
zstrp : 3291464
*zstrp: hallo Welt
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC:
- ZSTRING existiert seit FreeBASIC v0.13
- Seit FreeBASIC v1.07.0 kann von einem ZSTRING mithilfe von EXTENDS geerbt werden.
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ZSTRING nicht zur Verfügung und kann nur über __ZSTRING aufgerufen werden.
Siehe auch:
SIZEOF, VARPTR, STRPTR, CAST, CHR, ASC, STR, VAL, BIN, HEX, OCT, SPACE, INPUT (Funktion), DIM, STRING (Datentyp), WSTRING (Datentyp), Datentypen, Datentypen und Deklarationen, String-Funktionen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|