Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Erstes Zeichen eines Strings mit Copy (https://www.delphipraxis.net/168275-erstes-zeichen-eines-strings-mit-copy.html)

Delphi-Laie 12. Mai 2012 15:29

Delphi-Version: 5

Erstes Zeichen eines Strings mit Copy
 
Hallo Delphifreunde!

Mit Erstaunen stellte ich fest, daß man das erste Zeichen eines Strings sowohl mit Copy([Stringvariable],0,1) als auch mit Copy([Stringvariable],1,1) lesen kann. Das trifft für alle 3 Stringtypen (klassiche bzw. "short strings", lange bzw. "ANSI strings" und "wide strings" bzw. Unicodestrings) gleichermaßen zu.

Nur beim Adressieren wie ein Array über Stringvariable[x] funktioniert es m.E. korrekt: Index 0 ist unzulässig, 1 hingegen zulässig.

Ist das ein Fehler der Copy-Funktion, oder soll das so sein? Ist man immer "auf der sicheren Seite", egal, ob man 0 oder 1 verwendet?

Danke und Gruß

Delphi-Laie

Andreas L. 12. Mai 2012 16:23

AW: Erstes Zeichen eines Strings mit Copy
 
Das Verhalten kann ich bestätigen (D6, D7, D2009). Würde aber trotzdem immer 1 angeben ;-)

Delphi-Quellcode:
  ShowMessage(Copy('Hallo', 0, 1));

jaenicke 12. Mai 2012 16:50

AW: Erstes Zeichen eines Strings mit Copy
 
Es ist nicht dokumentiert, aber Copy korrigiert das automatisch. Nebenbei: Jeder Wert größer als 0 wird automatisch um 1 dekrementiert. ;-) Denn arbeiten tut Copy intern ab 0. :D
(Und jeder Wert kleiner als Null wird zu Null.)

Dokumentiert (und damit problemlos nutzbar) ist hingegen, dass man ruhig als Länge MaxInt (also sprich einen größeren Wert als die existierende Länge) angeben kann, wenn man "den Rest ab Position X" haben will.

Delphi-Laie 12. Mai 2012 17:07

AW: Erstes Zeichen eines Strings mit Copy
 
Dank Euch beiden!

Vermutlich gilt das auch für das Kopieren aller Längen aus einem String, nicht nur für ein Zeichen.

himitsu 12. Mai 2012 17:43

AW: Erstes Zeichen eines Strings mit Copy
 
Es gibt kein Copy für ShortString ... der wird vorher in einen AnsiString konvertiert.

Und ja, das ist leider ein "Bug", welcher seit vielen Jahren bekannt ist und es gibt keinerlei Bestreben dieses zu reparieren.

Indize kleiner-gleich 0 werden auf 1 angehoben, ohne daß Count dabei angepaßt wird. :cry:

Hansa 12. Mai 2012 18:02

AW: Erstes Zeichen eines Strings mit Copy
 
Achtung ! St [0], also das nullte Zeichen (bzw. das 1.) ist das Längenbyte. Ich würde das jedenfalls nicht benutzen.

himitsu 12. Mai 2012 18:07

AW: Erstes Zeichen eines Strings mit Copy
 
Beim ShortString, stimmt es, denn darin liegt das Längenbyte, was übrigens auch der Grund ist, warum in alle Strings der Text bei 1 beginnt.
Abwärtskompatibilität halt.

Beom Copy ist es aber egal, da es immer bei 1 beginnt.
Im Gegenzug zu direkten Zugriffen ala s[i] werden bei Copy(s, i, 1) die Array-Grenzen beachtet.
Bei s[i] mit i<=0 oder i>=Length(s) kann man hoffentlich mit einer Exception rechnen.

Delphi-Laie 12. Mai 2012 18:20

AW: Erstes Zeichen eines Strings mit Copy
 
Zitat:

Zitat von himitsu (Beitrag 1166270)
Und ja, das ist leider ein "Bug", welcher seit vielen Jahren bekannt ist und es gibt keinerlei Bestreben dieses zu reparieren.

Indize kleiner-gleich 0 werden auf 1 angehoben, ohne daß Count dabei angepaßt wird. :cry:

Anscheinend berücksichtigten das die Programmierer des Freepascalcompilers. Zumindest wird ein Copy (ab) der Position 0 klaglos kompiliert. Ob es auch problemlos auf 1 anpaßt / anhebt und damit läuft, kann ich jetzt auf die Schnelle nicht sagen.

Edit: Auch bei Freepascal scheint es egal zu sein, ob man 0 oder 1 für das erste Zeichen in der Copy-Funktion angibt. Wurde der Fehler also dort vermutlich ganz absichtlich hineinprogrammiert, um (hier) maximale Delphi-Kompatibilität zu erhalten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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