![]() |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
Genau, es ist nur Text.
Und den Aufruf von length wollte ich vermeiden. Wenn lange Strings max. 2GB lang sein können, müsste LongWord als Typ für die Länge reichen, oder? Das war meine anfängliche Sorge... |
AW: String-Ende mit while finden
LongWord/Cardinal wäre passend.
|
AW: String-Ende mit while finden
ShortString (der erste Delphi-String hat im Char [0] sein LängenByte)
LongString im Delphi (String, bzw. AnsiString und Nachfahren ala UTF8String, sowie UnicodeString) und auch der WideString (Interne Weiterleitung zur ![]() gibt es einen Integer vor den Chars (ein Record im negativen Index, mich Length, CodePage, RefereceCount und CharSize) Und nach dem letzten Char gibt es noch implizit zwei #0. #0 als StringEnde wird implitzt für "einfache" Castas zu PChar untersützt, aber der String selber reagiert ausschließlich auf die Längenangabe. Man kann nach PChar casten und APIs ala ![]() Oder wenn man einfach nur abschneiden will, dann die impliziten String-Funktionen für PChar->String nutzen.
Delphi-Quellcode:
S := PChar(S);
Zitat:
Leider auch dann, wenn man für 64 Bit kompiliert. (k.A. warum hier jemand auf diese saudämliche Idee gekommen ist) Ansonsten wäre NativeInt der passende Typ gewesen. :cry: Denn intern ist String eigentlich nur ein aufgemotztes dynamische Array und dessen Length ist als NativeInt deklariert, womit unter 64 Bit diese Typen nicht mehr kompatibel sind. :wall: |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
"[...] aber der String selber reagiert ausschließlich auf die Längenangabe [...]"
Aber ich kann doch das while-Konstrukt mit dem Vergleich auf #0 benutzen, oder? Es gibt keinen Zugriffsfehler am Ende? |
AW: String-Ende mit while finden
Zitat:
|
AW: String-Ende mit while finden
Zitat:
"Length(Text)" und "While not #0 inc(i)" Length liefert länge vom text, incremental count liefer zusätzlich auch alles nicht-sichtbare. Beispiel Zeilenumbrüche = 2 bytes |
AW: String-Ende mit while finden
Length liefert NICHT die Zeilenumbrüche mit?
Das würde mich jetzt aber aus der Bahn werfen... |
AW: String-Ende mit while finden
Zitat:
Über einen Cast nach PChar kannst du auch "sicher" zwei 2 Zeichen hinter das String-Ende zugreifen. Ein Leer-String ist eigentlich NIL, aber ![]() PS: Zwei #0 als Ende, weil es im Windows auch ein Art StringList / Array gibt, wo Strings per #0 getrennt sind und das Ende der Liste als #0#0 definiert ist (also ein leerer String '' ist das Ende) Und zusällig wird dieses auch in der Delphi-RTTI verwendet, z.B. für die Namen in Enums. (weswegen man hier auch keine RTTI für Enums bekommt, wo Werte übersprungen werden :cry:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz