![]() |
Kann man hier den Überlauf abfangen?
Durch Zufall ist mir etwas aufgefallen.
Delphi-Quellcode:
aber auch
ShowMessage(IntToStr(StrToInt('$EFFFFFFF')));
//usw.
Delphi-Quellcode:
Hier werden falsche Werte zurückgegeben. Gibt es eine Möglichkeit den Überlauf abzufangen? Oder muss ich es selbst vorher prüfen? Das Problem ist aber, dass für Delphi $FFFFFFFF kleiner $7FFFFFFF ist, wenn es Integer-Werte sind.
var
i: Integer; begin i := 4294967295; ShowMessage(IntToStr(i)); |
AW: Kann man hier den Überlauf abfangen?
Projekt --> Optionen --> Erzeugen --> Delphi-Compiler --> Complieren
Dort kannst du unter Laufzeitfehler Bereichsüberprüfung (hier relevant) usw. aktivieren. In neuen Projeken ist das (in aktuellen Delphiversionen) unter Debug standardmäßig aktiv, unter Release musst du es, wenn du das möchtest auch da aktivieren. Eine Warnung sollte die erste Variante aber auch beim Kompilieren schon generieren. |
AW: Kann man hier den Überlauf abfangen?
Seit einige Delphi-Versionen ist das in neuen Projekten auch standardmäßig aktiv.
|
AW: Kann man hier den Überlauf abfangen?
Zitat:
Für welche Delphi-Version soll es sein? |
AW: Kann man hier den Überlauf abfangen?
Moment.
Integer ist doch einfach nur ein ganzzahliger Wert, welcher laut Definition Integer = -2147483648..2147483647 ist. Demnach kann 4294967295 da gar nicht rein passen. 4294967295 2147483647 Was du brauchst wäre Cardinal = 0..4294967295 Und "UIntToStr", da sonst der Parameter nicht passt. Da das erste Bit ja für das Minuszeichen benutzt wird, muss 0xFFFFFFFF kleiner sein als 0x7FFFFFFF. Ich hoffe soweit alles etwas klarer. Falls du tatsächlich mit solch grpßen Zahlen arbeiten musst, musst du vielleicht auf Int64 gehen. vgl. ![]() Liebe Grüße Incocnito |
AW: Kann man hier den Überlauf abfangen?
Zitat:
|
AW: Kann man hier den Überlauf abfangen?
Zitat:
|
AW: Kann man hier den Überlauf abfangen?
Was ich nicht geschrieben habe ist, dass ich die Zahl aus einem Editfeld übernehme. Übergebe ich die Zahl direkt, wird das vom Compiler noch evtl. erkannt, aber bei Editfeld als String wird es problematischer.
Um das abzufangen gehe ich aktuell, bis ich etwas besseres finde, den Umweg über Int64 (bzw. StrToInt64). Dann prüfe ich ob die Grenzen von Integer verletzt werden. Klappt zumindest. |
AW: Kann man hier den Überlauf abfangen?
Zitat:
Delphi-Quellcode:
Und mit aktivierter Bereichsprüfung (siehe oben) knallt es bei der Zuweisung:
var
Value: Integer; begin if not TryStrToInt(Edit1.Text, Value) then ShowMessage('Nicht im gültigen Bereich'); // Wenn NumbersOnly beim Edit aktiviert ist, können nur Zahlen eingegeben werden, dann kann der Fehler nur der Zahlenbereich sein
Delphi-Quellcode:
var
Value: Int64; Value2: Integer; begin if not TryStrToInt64(Edit1.Text, Value) then ShowMessage('Fehler'); try Value2 := Value; except on E: ERangeError do ShowMessage('Nicht im gültigen Bereich'); end; |
AW: Kann man hier den Überlauf abfangen?
Delphi-Quellcode:
try
{$RANGECHECKS ON} Value2 := Value; { und hier vielleicht wieder deaktivieren, falls es vorher inaktiv war } except |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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-2025 by Thomas Breitkreuz