Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

AW: ZeroBasedStrings an/aus behandeln

  Alt 30. Dez 2021, 21:17
Das macht der Compiler schon und ersetzt den Ausdruck Low(string) entweder mit 0 oder 1.
Jupp, daher geht auch ein {$IF Low(string) = 0} , da Low(string) eine echte Konstante darstellt und bereits vom Compiler interpretiert wird.

Low(string) wird im Compiler bestimmt und eventuell sogar wegoptimiert.

MyString[Low(string)] wird immer auf 0 runtergerechnet, denn egal ob 1-Index oder 0-basierend ... intern wird es immer ein Offest 0 sein.



Wie an meinem Beispielen gezeigt, muß man in seinem Code auch garnichts entscheiden/berechnen.

Also entweder man arbeitet mit der "aktuellen" Indexberechnung, oder man arbeitet einfach immer mit einem bestimmten Offset und stellt den Code entsprechend ein.

Nur eine Ausnahme gibt es. Bei einer eigenen lokalen Compilereinstellung, muß man aufpassen, dass Indize zu externen Funktionen entsprechend umgerechnet werden, z.B. bei Verwendung von "externen" Funktionen wie Copy.

Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
begin
  var S := 'abc';
  {$ZEROBASEDSTRINGS OFF}
  Caption := Caption + ' ' + Low(string).ToString + S[1] + Copy(S, 1, 1);

  {$ZEROBASEDSTRINGS ON}
  Caption := Caption + ' ' + Low(string).ToString + S[1] + Copy(S, 1, 1);
end;
1aa 0ba

{$ZEROBASEDSTRINGS ...} im Code gilt immer nur für die aktuelle Unit,
also ist die ganze Unit unter der eigenen Kontrolle, dann reicht es einmal zu Beginn der Unit,
und man muß sich nicht mühevoll den Zustand merken und reverten.

Genauso, wie bei Vielen der anderen Compilerschalter.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (31. Dez 2021 um 21:15 Uhr)
  Mit Zitat antworten Zitat