Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kann man hier den Überlauf abfangen? (https://www.delphipraxis.net/214897-kann-man-hier-den-ueberlauf-abfangen.html)

Alallart 2. Apr 2024 00:49

Kann man hier den Überlauf abfangen?
 
Durch Zufall ist mir etwas aufgefallen.

Delphi-Quellcode:
  ShowMessage(IntToStr(StrToInt('$EFFFFFFF')));
  //usw.
aber auch

Delphi-Quellcode:
var
  i: Integer;
begin
  i := 4294967295;
  ShowMessage(IntToStr(i));
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.

jaenicke 2. Apr 2024 05:32

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.

himitsu 2. Apr 2024 09:51

AW: Kann man hier den Überlauf abfangen?
 
Seit einige Delphi-Versionen ist das in neuen Projekten auch standardmäßig aktiv.

Uwe Raabe 2. Apr 2024 09:54

AW: Kann man hier den Überlauf abfangen?
 
Zitat:

Zitat von Alallart (Beitrag 1535180)
Hier werden falsche Werte zurückgegeben.
Gibt es eine Möglichkeit den Überlauf abzufangen?

Was ist denn das konkrete Problem: Die falschen Werte oder dir Overflow-Meldung?

Für welche Delphi-Version soll es sein?

Incocnito 3. Apr 2024 07:30

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. http://docwiki.embarcadero.com/RADSt...phi-Datentypen

Liebe Grüße
Incocnito

jaenicke 3. Apr 2024 08:15

AW: Kann man hier den Überlauf abfangen?
 
Zitat:

Zitat von Incocnito (Beitrag 1535240)
Demnach passt 4294967295 da gar nicht rein.

Ja, genau darum ging es bei der Frage. ;-)

Incocnito 3. Apr 2024 09:19

AW: Kann man hier den Überlauf abfangen?
 
Zitat:

Zitat von jaenicke (Beitrag 1535241)
Zitat:

Zitat von Incocnito (Beitrag 1535240)
Demnach passt 4294967295 da gar nicht rein.

Ja, genau darum ging es bei der Frage. ;-)

Ich habe das mal etwas anders geschrieben, damit es besser zur Frage passt ;-)

Alallart 3. Apr 2024 23:37

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.

jaenicke 4. Apr 2024 06:09

AW: Kann man hier den Überlauf abfangen?
 
Zitat:

Zitat von Alallart (Beitrag 1535283)
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.

Da ist es doch noch viel einfacher:
Delphi-Quellcode:
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
Und mit aktivierter Bereichsprüfung (siehe oben) knallt es bei der Zuweisung:
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;

himitsu 4. Apr 2024 09:59

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 21:07 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