Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi merkt nicht wenn ein case-Statement vollständig ist, oder? (https://www.delphipraxis.net/209408-delphi-merkt-nicht-wenn-ein-case-statement-vollstaendig-ist-oder.html)

Der schöne Günther 2. Dez 2021 20:05

Delphi-Version: 10 Seattle

Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Ich bekomme bei folgendem
Delphi-Quellcode:
case
-Statement eine Warnung, dass eine Variable "möglicherweise" nicht initialisiert sein könnte:
Delphi-Quellcode:
type
   TEnum = (a, b, c);
var
   myEnum: TEnum;
   value: Byte;
begin
   myEnum := TEnum.a;
   case myEnum of
      TEnum.a:   value := 10;
      TEnum.b:   value := 20;
      TEnum.c:   value := 30;
   end;
   WriteLn(value); // W1036"might not have been initialized"
   // altough the case statement is exhaustive
end.
Bei C++ ist der Compiler schlau genug:
Code:
enum Enum {a, b, c};

int main(int argc, char **argv) {
   Enum e = Enum::b;
   char c;
   switch (e)
   {
      case Enum::a:
         c = 1;
         break;
      case Enum::b:
         c = 2;
         break;
      case Enum::c:
         c = 3;
         break;
   }   

   std::cout << c;
   return NO_ERROR;
}
Bei Sprachen wie Swift oder Rust bricht der Compiler mit einem Fehler ab, wenn ein match-Statement nicht vollständig ist.

Delphi bekommt von all dem aber nichts mit, und redet sich damit raus, dass es "möglicherweise" undefiniert sein könnte.
Zumindest in 10.0 Seattle.

Ist das in einer aktuellen Delphi-Version immer noch so?

himitsu 2. Dez 2021 20:09

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Jupp, denn Delphi weiß, dass in deinem Enum noch 253 weitere Werte sein können.

z.B.
Delphi-Quellcode:
myEnum := TEnum(123);



Sowas kannst du nur ausschließen, wenn bei Zuweisung an diese Variable der Wertebereich geprüft wird,
und wenn man sämtliche Fehler ausschließen kann, z.B. böse Casts, fehlgeleitete Pointer, Buffer-Overflow, Häcker/Würmer/Viren, usw.

Der schöne Günther 2. Dez 2021 20:14

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Oder es heißt dass der Teil der die Fehlermeldungen generiert gar nichts mehr von Enums weiß, da er nur noch mit blanken Zahlentypen arbeitet.

Oh mann... 😕

BerndS 2. Dez 2021 20:32

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Ich füge dem case oft noch ein else hinzu, wobei dann im Debug eine Exception ausgelöst wird und im Release passiert nichts.
Kommt später was zur Aufzählung hinzu, so erinnert mich die Exception dann, das noch was fehlt.

bernau 2. Dez 2021 23:32

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Zitat:

Zitat von BerndS (Beitrag 1498595)
Ich füge dem case oft noch ein else hinzu, wobei dann im Debug eine Exception ausgelöst wird und im Release passiert nichts.
Kommt später was zur Aufzählung hinzu, so erinnert mich die Exception dann, das noch was fehlt.

Bei mir auch. Genau so.

himitsu 2. Dez 2021 23:47

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Ich werfe die Exceptions immer, egal ob Debug oder Release.
Oder setze im Else die Variable auf NIL, was eh sein muß, weil ja sonst der Compiler von nicht-initialisierten Variablen schwafelt.

Abgesehn da, wo eh immer nur ein Teil behandelt wird.

Rollo62 3. Dez 2021 06:41

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
 
Ich setze IMMER ein "else", weil man ja schnell mal einen Typen ergänzt und dabei ein case statement vergisst.
Das macht es dann "sichtbarer", fehlertolerant und die Fehlersuche ist dann viel leichter als wenn man sich auf Compiler-Automatismen verlassen würde.
Deswegen finde ich das Warning auch gut und richtig.


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