![]() |
Typenzuweisung sollte abstürzen
Hallo Zusammen,
Ich habe folgenden Beispielcode geschrieben:
Delphi-Quellcode:
In den Projektoptionen habe ich die Bereichsprüfung auf "TRUE".
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. 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 |
AW: Typenzuweisung sollte abstürzen
Ich hätte jetzt auch einen Range Error erwartet. :cyclops:
Probier doch mal
Delphi-Quellcode:
- also ohne explizit Wertzuweisungen. Die werden von Delphi nur halbseiden unterstützt. Und sind eh immer überflüssig. :mrgreen:
TTestTyp = (KeinSet, SetFestgelegt, SetIndividuell);
|
AW: Typenzuweisung sollte abstürzen
Mit dieser Zeile:
Delphi-Quellcode:
machst Du eine HardCast. Du teilst also dem Compiler mit: hey ich will das so ....
a := TTestTyp(3);
was erwartest Du? |
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. |
AW: Typenzuweisung sollte abstürzen
Hier noch ein paar mehr Beispiele:
Delphi-Quellcode:
Siehe auch:
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. Zitat:
![]() |
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 |
AW: Typenzuweisung sollte abstürzen
Zitat:
Es ist lange her aber meine Tochter hat sich mal bei mir ausgeheult, aber ein Compiler? Gruß K-H |
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" |
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:
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 10:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz