![]() |
Re: length(s) = 0 ODER s = '' ?
Nein, wieso sollte? Das Längenbyte an Index 0 bei einem String wird nur noch emuliert und der Zugriff darauf verboten. Bei einem ShortString kann man aber gerne noch darin rumpfuschen.
SetLength(s, 1); erzeugt einen String mit einer Länge von 1 - d.h. der Index 1 ist gültig und somit nutzbar. Das Längenbyte an Index 0 wird simuliert und existiert ausserhalb der Regel und ist eh nicht von SetLength() betroffen. SetLength() bei Strings setzt direkt die Länge und da Strings 1-basierend sind, ist es ein String der Länge von 1 Zeichen. Im Gegensatz zur Nutzung von dynamischen Array's die tatsächlich immer nullbasierend sind. |
Re: length(s) = 0 ODER s = '' ?
Genaugenommen wird mir SetLength(S, 1) ein Array mit der Länge 2 erstellt, da dem String aus Kompatibilitätsgründen zu PChar noch eine #0 anhängt wird.
Und das bei LongStrings (AnsiString, WideString) ebenfalls mit der Zählung bei 1 beginnen, obwohl es das Längenbyte nicht mehr gibt, sollte ebenfalls allen bekannt sein - ist ja wegen der Kompatitär zu den "alten" ShortStrings. Hier nochmal die genauen Definitionen der Stringtypen:
Delphi-Quellcode:
Type TShortStringInfo = packed Record
Length: Byte; <<< @VarOfThisType Chars: packed Array[1..Length(thisString)] of Char; End; TDynArrayInfo = packed Record //MemoryInfo: LongInt; RefCount: LongInt; ElementCount: LongInt; Data: packed Array[0..High(thisArray)] of {ArrayTyp}; <<< @VarOfThisType End; TAnsiStringInfo = packed Record //MemoryInfo: LongInt; RefCount: LongInt; ElementCount: LongInt; Data: packed Array[1..Length(thisString)] of AnsiChar; <<< @VarOfThisType StringEnd: AnsiChar; < ist immer #0 End;
Code:
.MemoryInfo gehört eigentlich zum MemoryManager, aber da für jedes Array ein eigener Speicherblock reservert wird, ist das halt "immer" an dieser Stelle :roll:
@ShortString = TShortStringInfo/TShortStringInfo.Length
@DynArray = TDynArrayInfo.Data/TDynArrayInfo.Data[0] @String/@AnsiString = TAnsiStringInfo.Data/TAnsiStringInfo.Data[1] |
Re: length(s) = 0 ODER s = '' ?
:lol: eigentlich war die ursprüngliche Frage ja nur ob Length(s) = 0 oder s = '' :wall:
|
Re: length(s) = 0 ODER s = '' ?
Es geht auch kurz, :tongue:
s = '' oder wenn man unbedingt will Pointer(s) = nil |
Re: length(s) = 0 ODER s = '' ?
Zitat:
|
Re: length(s) = 0 ODER s = '' ?
Zitat:
Aber wenn der String vorher länger als "1" war, dann ist der Inhalt sehr wohl definiert, er besteht nämlich aus dem ersten Zeichen der Daten, welche vorher drin waren :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 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