Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Typenzuweisung sollte abstürzen (https://www.delphipraxis.net/190115-typenzuweisung-sollte-abstuerzen.html)

OlliWW 1. Sep 2016 10:43

Typenzuweisung sollte abstürzen
 
Hallo Zusammen,

Ich habe folgenden Beispielcode geschrieben:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  TTestTyp = (KeinSet = 0, SetFestgelegt = 1, SetIndividuell = 2);


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  a: TTestTyp;
begin
  a := TTestTyp(3);
  ShowMessage(Ord(a).ToString);
end;

end.
In den Projektoptionen habe ich die Bereichsprüfung auf "TRUE".

Ich würde bei der Zuweisung einen Absturz mit "außerhalb des gültigen Bereichs" erwarten. Das Programm läuft aber ohne zu murren durch. Auch das ShowMessage zeigt mir die "3" an.
Wenn ich mir "a" im Debugger nach der Zuweisung anschaue, sehe ich "(außerhalb des gültigen Bereichs) 3".

Habe ich hier einen Denkfehler, oder wie kann ich Delphi dazu überreden an der Stelle abzustürzen oder sich zumindest irgendwie anders bemerkbar zu machen.

Genutzt wird: Delphi Berlin 10.1 - 32bit - VCL

uligerhardt 1. Sep 2016 10:48

AW: Typenzuweisung sollte abstürzen
 
Ich hätte jetzt auch einen Range Error erwartet. :cyclops:

Probier doch mal
Delphi-Quellcode:
  TTestTyp = (KeinSet, SetFestgelegt, SetIndividuell);
- also ohne explizit Wertzuweisungen. Die werden von Delphi nur halbseiden unterstützt. Und sind eh immer überflüssig. :mrgreen:

Fritzew 1. Sep 2016 10:50

AW: Typenzuweisung sollte abstürzen
 
Mit dieser Zeile:
Delphi-Quellcode:
 a := TTestTyp(3);
machst Du eine HardCast. Du teilst also dem Compiler mit: hey ich will das so ....

was erwartest Du?

OlliWW 1. Sep 2016 10:53

AW: Typenzuweisung sollte abstürzen
 
Hallo,

Danke für die schnellen Antworten.

Ich habe es nun ohne Zuweisung probiert, allerdings mit dem selben Ergebnis.

Auch bei einer "harten" Zuweisung würde ich trotzdem einen Fehler erwarten, es kann ja sein dass der User eben fehlerhafte Eingaben macht. Wenn ich ein Objekt zu etwas falschem caste, bekomm ich ja sonst auch eine Fehlermeldung.

Ich bin mir auch relativ sicher, dass es in vorherigen Delphi Versionen so funktioniert hat, wie ich es erwarten würde.

Der schöne Günther 1. Sep 2016 10:55

AW: Typenzuweisung sollte abstürzen
 
Hier noch ein paar mehr Beispiele:

Delphi-Quellcode:
program Project11;

{$APPTYPE CONSOLE}

type
   TMyEnum = (uno, dos, tres);
   TMyRange = 10..20;
var
   someBoolean:   Boolean;
   someEnum:      TMyEnum;
   someRange:      TMyRange;
begin
   someBoolean := Boolean(99);
   someEnum := TMyEnum(99);
   someRange := TMyRange(99);

   WriteLn(someBoolean);
   WriteLn(Ord(someEnum));
   WriteLn(someRange);

   Readln;
end.
Siehe auch:
Zitat:

Whichever way you look at it, range checking is fundamentally flawed as a mechanism for identifying fundamental, static errors in code, and has some very nasty smells about it in the Delphi implementation in particular.
http://www.deltics.co.nz/blog/posts/2344

Fritzew 1. Sep 2016 11:04

AW: Typenzuweisung sollte abstürzen
 
Das sind aber immer noch HardCasts und wenn Du einen Cast benutzt heulst Du den Compiler aus
Solange wir für casts nur eine Möglichkeit haben anders wie in C++ mit reinterpret und co kommst Du da nicht dagegen an

p80286 1. Sep 2016 11:12

AW: Typenzuweisung sollte abstürzen
 
Zitat:

Zitat von Fritzew (Beitrag 1346419)
Das sind aber immer noch HardCasts und wenn Du einen Cast benutzt heulst Du den Compiler aus
Solange wir für casts nur eine Möglichkeit haben anders wie in C++ mit reinterpret und co kommst Du da nicht dagegen an

Könnte mir das jemand mal bitte übersetzen?
Es ist lange her aber meine Tochter hat sich mal bei mir ausgeheult, aber ein Compiler?

Gruß
K-H

Fritzew 1. Sep 2016 11:21

AW: Typenzuweisung sollte abstürzen
 
"hebelst" Du den Compiler aus.
Oder besser gesagt Du teilst dem Compiler mit "Sei ruhig, ich weis genau was ich tue"

himitsu 1. Sep 2016 12:52

AW: Typenzuweisung sollte abstürzen
 
RangeErrorChecks sind per Default deaktiviert.

Und dieser Enum ist einen Byte groß (bei Standardeinstellungen), also kann er die Werte bis "ordinalen" 0 bis 255 enthalten.
Genauso, wie ein Boolean mehr als nur 2 Zustände kennt.

Zitat:

Zitat von uligerhardt (Beitrag 1346415)
Die werden von Delphi nur halbseiden unterstützt.

Delphi unterstützt die, aber der Eompiler kann dafür keine RTTI der namentlichen Bezeichner anlegen, da das zugehörige C-Array nicht mit "leeren" Einträgen umgehen kann und die Einträge immer mit Ordinal 0 beginnen müssen.
als Array-Ende gilt hier einen "Leerstring" und ich hatte vor vielen Jahren Codegear/Embarcadero mal vorgeschlagen das einfach mit "Dummywerten" zu füllen, aber auf mich hört ja Keiner:


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