Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi length(s) = 0 ODER s = '' ? (https://www.delphipraxis.net/65042-length-s-%3D-0-oder-s-%3D.html)

Muetze1 13. Mär 2006 11:26

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.

himitsu 14. Mär 2006 12:27

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:
@ShortString        = TShortStringInfo/TShortStringInfo.Length
@DynArray           = TDynArrayInfo.Data/TDynArrayInfo.Data[0]
@String/@AnsiString = TAnsiStringInfo.Data/TAnsiStringInfo.Data[1]
.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:

Angel4585 14. Mär 2006 12:30

Re: length(s) = 0 ODER s = '' ?
 
:lol: eigentlich war die ursprüngliche Frage ja nur ob Length(s) = 0 oder s = '' :wall:

himitsu 14. Mär 2006 15:44

Re: length(s) = 0 ODER s = '' ?
 
Es geht auch kurz, :tongue:

s = ''

oder wenn man unbedingt will

Pointer(s) = nil

NicoDE 14. Mär 2006 15:50

Re: length(s) = 0 ODER s = '' ?
 
Zitat:

Zitat von runger
Streng genommen erzeugt setlength(S,1) einen leeren
String mit der Länge 0.

Eher einen String der Länge 1 mit undefiniertem Inhalt...

himitsu 15. Mär 2006 11:02

Re: length(s) = 0 ODER s = '' ?
 
Zitat:

Zitat von NicoDE
Eher einen String der Länge 1 mit undefiniertem Inhalt...

Mit der Länge stimme ich dir ja "fast" zu .. die #0 :zwinker:

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

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