Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - ZSTRING

Referenz-Navigation

 

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?
BefehlsreferenzeintragSTRING- 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 BefehlsreferenzeintragINTEGER, BefehlsreferenzeintragDOUBLE 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 Externer Link!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:

Der Nachteil der Längenkennzeichnungsmethode der ZSTRINGs besteht darin, dass BefehlsreferenzeintragCHR(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 BefehlsreferenzeintragUBYTE-Array (siehe BefehlsreferenzeintragDIM) betrachtet werden. Dabei ist es möglich, dieses Array statisch zu behandeln; der ZSTRING ist dann fixed length (siehe zu fixed length auch BefehlsreferenzeintragSTRING (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 BefehlsreferenzeintragREDIM, sondern über BefehlsreferenzeintragREALLOCATE.

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 BefehlsreferenzeintragZSTRING POINTER muss allerdings selbstständig darauf geachtet werden.

ZSTRINGs werden sehr häufig bei der Übergabe von Strings an oder von externen BefehlsreferenzeintragSUBs/BefehlsreferenzeintragFUNCTIONs 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:

Unterschiede unter den FB-Dialektformen:
In der Dialektform Befehlsreferenzeintrag-lang qb steht ZSTRING nicht zur Verfügung und kann nur über __ZSTRING aufgerufen werden.

Siehe auch:
BefehlsreferenzeintragSIZEOF, BefehlsreferenzeintragVARPTR, BefehlsreferenzeintragSTRPTR, BefehlsreferenzeintragCAST, BefehlsreferenzeintragCHR, BefehlsreferenzeintragASC, BefehlsreferenzeintragSTR, BefehlsreferenzeintragVAL, BefehlsreferenzeintragBIN, BefehlsreferenzeintragHEX, BefehlsreferenzeintragOCT, BefehlsreferenzeintragSPACE, BefehlsreferenzeintragINPUT (Funktion), BefehlsreferenzeintragDIM, BefehlsreferenzeintragSTRING (Datentyp), BefehlsreferenzeintragWSTRING (Datentyp), BefehlsreferenzeintragDatentypen, BefehlsreferenzeintragDatentypen und Deklarationen, BefehlsreferenzeintragString-Funktionen


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 26.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 02.09.2020 von RedakteurMOD gespeichert.
  Versionen Versionen