![]() |
TStringHelper 0-indiziert
Moin Zusammen,
ich brauche mal etwas seelischen Beistand ... Ich habe eine (nicht nachstellbare) Zugriffsverletzung in einer Funktion gehabt, welche bei TStringHelper.Trim ausschlägt. Jetzt schaue ich mir die Funktion an und stelle bei Delphi 10.4 fest, dass dort hard-coded mit 0-Indizierten Strings gearbeitet wird. Wenn ich die Funktion kopiere und so an anderer Stelle aufrufe knallt es logischer Weise. Beispiel: Ich nehme den String sValue mit Wert "S" sage dann "Trim(S)" und er fliegt gleich mit Bereichsprüfungs-Fehlern raus, da er versucht auf sValue[0] zuzugreifen. Hier der Auszug aus System.SysUtils (in der Hoffnung, dass ich damit kein Copyright verletze!):
Delphi-Quellcode:
Das gleiche passiert auch an anderen Stellen beim TStringHelper.
function TStringHelper.Trim: string;
var I, L: Integer; begin L := Self.Length - 1; I := 0; if (L = -1) or (Self[I] > ' ') and (Self[L] > ' ') then Exit(Self); while (I <= L) and (Self[I] <= ' ') do Inc(I); if I > L then Exit(''); while Self[L] <= ' ' do Dec(L); Result := Self.SubString(I, L - I + 1); end; Wie kann das funktionieren? Weiß das jemand? Sieht die echte "TStringHelper.Trim"-Funktion anders aus? Ich hätte erwartet, dass er entweder eine Unterscheidung für die Zielplattformen hat, oder eine Korrektur fährt (ich nutze für String-Funktionen, welche für beides genutzt wird zum Beispiel die Funktion "Low(sValue)", um jeweils den Startindex anzupassen, wenn ich das nicht mit StringHelper-Funktionen umgehen kann und beispielsweise den String manuell durchlaufe. Sorgen irgendwelche Compiler-Direktiven dafür, dass er das hintenrum irgendwie grade biegt, oder hat da einfach nur jemand die Bereichsprüfung deaktiviert und das knallt nur aus Glück bei niemandem? Liebe Grüße Incocnito |
AW: TStringHelper 0-indiziert
Zitat:
Um den Helper zu verwenden, müsstest du S.Trim verwenden. Konkreter Quelltext und die Fehlerdetails wären hilfreich. // EDIT: Ach ja, weshalb das funktioniert: Dort wird mit der passenden Compilerdirektive gearbeitet.
Delphi-Quellcode:
{$ZEROBASEDSTRINGS ON}
// wie der Name schon sagt, kann man danach auf Index 0 zugreifen |
AW: TStringHelper 0-indiziert
Zitat:
Delphi-Quellcode:
- steht auch so bei der TStringHelper Implementierung.
{$ZEROBASEDSTRINGS ON}
|
AW: TStringHelper 0-indiziert
Zitat:
sondern nur eine "normale" Funktion gemacht, welche ich dann als "TrimX(sValue)" aufgerufen hatte. Das hat jetzt in meinem Text für sprachliche Verwirrung gesorgt. :-S Zitat:
Und ist innerhalb von "Trim" als Zugriffsverletzung aufgetreten. Daher schaue ich gerade was das wohl für ein String (Leerstring? String mit nur einem Sonderzeichen?) gewesen sein könnte. (Aktueller Stand: Das kann ja gar nicht!) Zitat:
Zitat:
mit 0 indiziert und mal mit 1 indiziert arbeiten kann. Ich hatte diese Direktive eher als
Code:
gelesen, aber dann würde das beim Funktionsaufruf ja nicht mehr klappen.
ab hier sind alle Variablen vom Typ "String" tatsächlich vom Typ "AnsiRawUnicodeWhateverSuperSpezialString"
Auf jeden Fall euch beiden schonmal besten Dank für die "Erleuchtung". Jetzt kann ich wenigstens wieder ruhig schlafen. ;-) Liebe Grüße Incocnito |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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