Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   String-Ende mit while finden (https://www.delphipraxis.net/205210-string-ende-mit-while-finden.html)

KodeZwerg 12. Aug 2020 13:42

AW: String-Ende mit while finden
 
Zitat:

Zitat von Caps (Beitrag 1471686)
Ok, danke, ich probiere das mit #0.
Das war die Information, die sich in der Delphi-Hilfe ein wenig versteckt ^^.

Danke und Grüße!
Caps

gerne, allerdings gilt das mit #0 nur bei text strings. wenn dein ansistring binär ist klappt das alles nicht.

Caps 12. Aug 2020 13:44

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...

KodeZwerg 12. Aug 2020 13:45

AW: String-Ende mit while finden
 
LongWord/Cardinal wäre passend.

himitsu 12. Aug 2020 13:49

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 MSDN-Library durchsuchenSysAllocString-API)
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 MSDN-Library durchsuchenStrEnd benutzen.
Oder wenn man einfach nur abschneiden will, dann die impliziten String-Funktionen für PChar->String nutzen.
Delphi-Quellcode:
S := PChar(S);



Zitat:

LongWord/LongInt/Integer
Delphi verwendet überall Integer (LongInt) als Länge und Index.

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:

TiGü 12. Aug 2020 13:49

AW: String-Ende mit while finden
 
Zitat:

Zitat von Caps (Beitrag 1471690)
Genau, es ist nur Text.
Und den Aufruf von length wollte ich vermeiden.

Warum? Akademisches Interesse?

Caps 12. Aug 2020 13:51

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?

Caps 12. Aug 2020 13:51

AW: String-Ende mit while finden
 
Zitat:

Zitat von TiGü (Beitrag 1471693)
Zitat:

Zitat von Caps (Beitrag 1471690)
Genau, es ist nur Text.
Und den Aufruf von length wollte ich vermeiden.

Warum? Akademisches Interesse?

Ja ^^

KodeZwerg 12. Aug 2020 13:53

AW: String-Ende mit while finden
 
Zitat:

Zitat von TiGü (Beitrag 1471693)
Zitat:

Zitat von Caps (Beitrag 1471690)
Genau, es ist nur Text.
Und den Aufruf von length wollte ich vermeiden.

Warum? Akademisches Interesse?

hmm ich grübel gerade, eigentlich sollten es zwei unterschiedliche ergebnisse haben.
"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

Caps 12. Aug 2020 13:54

AW: String-Ende mit while finden
 
Length liefert NICHT die Zeilenumbrüche mit?
Das würde mich jetzt aber aus der Bahn werfen...

himitsu 12. Aug 2020 13:59

AW: String-Ende mit while finden
 
Zitat:

Zitat von Caps (Beitrag 1471694)
Es gibt keinen Zugriffsfehler am Ende?

Wenn du über den String zugreifst, dann mußt du neben #0 auch Length beachten, denn wenn kein #0 im String vorkommt, kommt es bei aktiver Indexprüfung zu einem Fehler.
Über einen Cast nach PChar kannst du auch "sicher" zwei 2 Zeichen hinter das String-Ende zugreifen.

Ein Leer-String ist eigentlich NIL, aber Delphi-Referenz durchsuchenPChar(S) leitet bei '' auf eine "Ersatz"-Konstante um welche aus #0#0 besteht, womit es dann immer ein #0 als Ende gibt. (außer jemand hat über einen BufferOverflow dieses zerschossen)


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.
Seite 2 von 3     12 3      

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