AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Fehler in Case-Konstrukt - E2030 Doppelte Case-Label
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler in Case-Konstrukt - E2030 Doppelte Case-Label

Ein Thema von hschmid67 · begonnen am 8. Sep 2019 · letzter Beitrag vom 8. Sep 2019
Antwort Antwort
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
62 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehler in Case-Konstrukt - E2030 Doppelte Case-Label

  Alt 8. Sep 2019, 07:57
Hallo Zusammen,

heute habe ich einen seltsamen Fehler, der zunächst in Tokyo aufgetaucht ist und den ich jetzt gerade auch in Rio 10.3.2 getestet habe. Ich möchte einzelne Zeichen konvertieren und hab dazu (vereinfacht zum Vorführen) etwa folgende Prozedur:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  lStr: string;
begin
  lStr := '123456789';
  for i := 1 to lStr.Length do
  begin
    case lStr[i] of
        #0 .. #44 : ;
       #45 : ;
       #46 .. #47 : ;
       #48 .. #57 : ;
       #58 .. #64 : ;
       #65 .. #90 : ;
       #91 .. #96 : ;
       #97 .. #122 : ;
      #123 .. #137 : ;
      #138 : ; // Hier der Fehler
    end;
  end;
end;
Dabei bekomme ich in der markierten Zeile den folgenden Fehler

Code:
E2030 Doppeltes Case-Label
Wenn ich gleich die Range #123 .. #138 setze, funktioniert das Ganze. Ich verstehe es nicht Ist das etwa ein Compiler-Fehler in Delphi? Oder kann mir jemand erklären, was ich hier falsch mache?

Viele Grüße
Harald
Harald Schmid
  Mit Zitat antworten Zitat
Redeemer

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

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

  Alt 8. Sep 2019, 08: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 08:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.011 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 8. Sep 2019, 08:45
Schreib mal ein {$HIGHCHARUNICODE ON} vor deine case-Anweisung. Näheres dazu kannst du hier nachlesen: HIGHCHARUNICODE-Direktive
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
62 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 8. Sep 2019, 09:06
Vielen Dank für Eure Hilfe und die Erklärungen!
Die Zeichensätze und all das Konvertieren bringen mich immer wieder zum Stolpern. Ich werde mir mit Euren Hinweisen noch einiges durchlesen und hoffe, dass ich es endlich besser verstehe

Viele Grüße
Harald
Harald Schmid
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:22 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