AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Kann man hier den Überlauf abfangen?
Thema durchsuchen
Ansicht
Themen-Optionen

Kann man hier den Überlauf abfangen?

Ein Thema von Alallart · begonnen am 2. Apr 2024 · letzter Beitrag vom 4. Apr 2024
Antwort Antwort
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#1

Kann man hier den Überlauf abfangen?

  Alt 2. Apr 2024, 01:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kann man hier den Überlauf abfangen?

  Alt 2. Apr 2024, 06:32
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: Kann man hier den Überlauf abfangen?

  Alt 2. Apr 2024, 10:51
Seit einige Delphi-Versionen ist das in neuen Projekten auch standardmäßig aktiv.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#4

AW: Kann man hier den Überlauf abfangen?

  Alt 2. Apr 2024, 10:54
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#5

AW: Kann man hier den Überlauf abfangen?

  Alt 3. Apr 2024, 08:30
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

Geändert von Incocnito ( 3. Apr 2024 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Kann man hier den Überlauf abfangen?

  Alt 3. Apr 2024, 09:15
Demnach passt 4294967295 da gar nicht rein.
Ja, genau darum ging es bei der Frage.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#7

AW: Kann man hier den Überlauf abfangen?

  Alt 3. Apr 2024, 10:19
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
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#8

AW: Kann man hier den Überlauf abfangen?

  Alt 4. Apr 2024, 00:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Kann man hier den Überlauf abfangen?

  Alt 4. Apr 2024, 07:09
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;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#10

AW: Kann man hier den Überlauf abfangen?

  Alt 4. Apr 2024, 10:59
Delphi-Quellcode:
  try
    {$RANGECHECKS ON} 
    Value2 := Value;
    { und hier vielleicht wieder deaktivieren, falls es vorher inaktiv war }
  except
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 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