AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

length(s) = 0 ODER s = '' ?

Ein Thema von BlueStarHH · begonnen am 11. Mär 2006 · letzter Beitrag vom 15. Mär 2006
Antwort Antwort
Seite 3 von 3     123   
Muetze1
(Gast)

n/a Beiträge
 
#21

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

  Alt 13. Mär 2006, 12:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

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

  Alt 14. Mär 2006, 13:27
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
$2B or not $2B
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#23

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

  Alt 14. Mär 2006, 13:30
eigentlich war die ursprüngliche Frage ja nur ob Length(s) = 0 oder s = ''
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#24

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

  Alt 14. Mär 2006, 16:44
Es geht auch kurz,

s = ''

oder wenn man unbedingt will

Pointer(s) = nil
$2B or not $2B
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#25

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

  Alt 14. Mär 2006, 16:50
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#26

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

  Alt 15. Mär 2006, 12:02
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

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
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz