Einzelnen Beitrag anzeigen

Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Fehler in Case-Konstrukt - E2030 Doppelte Case-Label

  Alt 8. Sep 2019, 09:42
Drei Probleme hier: 1. Dein Selektor hat einen anderen Typ als deine Labels. Irgendwas wird hier also implizit gecastet. Dürfte der Compiler auch anmerken. Spoiler: Wie man gleich sieht, werden deine AnsiChar-Labels implizit auf den WideChar-Typ des Selektors gecastet.
2. Zeichenkonstanten sind nicht so, wie man sich das vorstellt. Der Compiler castet nun also deine CP1252-Codepoints in den Labels auf UTF-16-Codepoints, um sie mit dem UTF-16-Codepoint im Selektor zu vergleichen. Das sieht dann so aus:
Delphi-Quellcode:
  for i := 1 to lStr.Length do
  begin
    case Ord(lStr[i]) of
        0 .. 44 : ;
       45 : ;
       46 .. 47 : ;
       48 .. 57 : ;
       58 .. 64 : ;
       65 .. 90 : ;
       91 .. 96 : ;
       97 .. 122 : ;
      123 .. 8240 : ;
      352 : ; // Hier der Fehler, 352 ist ja bereits in 123..8240 abgedeckt
    end;
  end;
Würden wir bis #138 zählen (statt #137) sieht es anders aus:
Delphi-Quellcode:
  for i := 1 to lStr.Length do
  begin
    case Ord(lStr[i]) of
        0 .. 44 : ;
       45 : ;
       46 .. 47 : ;
       48 .. 57 : ;
       58 .. 64 : ;
       65 .. 90 : ;
       91 .. 96 : ;
       97 .. 122 : ;
      123 .. 352: ; // Hier KEIN Fehler
    end;
  end;
3. #129 und vier weitere können nicht auf WideChar gecastet werden.
Also bitte in Case-Anweisungen keine Äpfel mit Birnen vergleichen und überhaupt Strings nicht als Ersatz für Delphi-Referenz durchsuchenTBytes verwenden. Wenn's unbedingt sein muss, je nach Situation AnsiString oder RawByteString verwenden.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer ( 8. Sep 2019 um 09:45 Uhr)
  Mit Zitat antworten Zitat