Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Integerüberlauf bei LongWord (https://www.delphipraxis.net/189394-integerueberlauf-bei-longword.html)

ing 8. Jun 2016 06:25

Integerüberlauf bei LongWord
 
Hallo,
Bei folgender Zuweisung bekomme ich einen Runtime Error (Integerüberlauf):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w:LongWord;
    i:Integer;
begin
  w:=3;
  i:=-w; // <-- Integerüberlauf
  ShowMessage(IntToStr(w)+' / '+IntToStr(i));
end;
Ich bin mir sicher, dass dieser Code bisher funktioniert hat.
Hat jemand eine Idee wo hier der Fehler liegt?

Danke,
ing

Lemmy 8. Jun 2016 06:35

AW: Integerüberlauf bei LongWord
 
naja.. da Longword einen gültigen Wertebereich von 0..4294967295 hat ist es eigentlich logisch, dass es bei negativer Zuweisung einen Überlauf gibt.

P.S.: Herzlich willkommen in der DP! :-)

Der schöne Günther 8. Jun 2016 06:53

AW: Integerüberlauf bei LongWord
 
Hallo :party:

Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
w:= -w;
wäre das so, aber nicht hier.

Und ich bekomme hier ehrlich gesagt auch keinen Überlauf. Welche Delphi-Version, welche Plattform? (Windows/Mac/... bzw. 32/64 Bit?)

ing 8. Jun 2016 06:58

AW: Integerüberlauf bei LongWord
 
Hallo Lemmy,

Zitat:

Zitat von Lemmy (Beitrag 1339712)
da Longword einen gültigen Wertebereich von 0..4294967295 hat ist es eigentlich logisch, dass es bei negativer Zuweisung einen Überlauf gibt.

Das leuchtet mir nicht recht ein:
w ist 3
i ist ein Integerwert
i:=-w; sollte also -3 ergeben. wo soll da ein Überlauf stattfinden?
i:=-3; funktioniert ja ohne Probleme.

Außerdem bin ich mir sicher, dass diese Zuweisung schon länger in meinem Programm drin steht und es bisher noch keine Probleme damit gab. ??

ing

ing 8. Jun 2016 07:01

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Welche Delphi-Version, welche Plattform?

Ich verwende Delphi 5 Professional (UpdatePack 1) und habe vor kurzem auf Windows 10 Pro (64 Bit) umgestellt.

TRomano 8. Jun 2016 07:05

AW: Integerüberlauf bei LongWord
 
Hallo und Willkommen in der DP !

So weit hast Du ja auch Recht, aber ... nach mehrmaligen Hinsehen habe ich aber auch erst das Minuszeichen gesehen !

i:= - w;

Das macht nichts weiter als eine Multiplikation mit -1 und schon bist Du aus dem gewähltenm Wertebereich raus und bekommst einen Überlauffehler.

Habe gerade mal ein altes Delphi 7 angeworfen und da steht: Longword = Cardinal (unsigned)

Gruß Thomas

Sir Rufo 8. Jun 2016 07:24

AW: Integerüberlauf bei LongWord
 
Ein Cast mit
Delphi-Quellcode:
i := - Integer( w );
sollte funktionieren.

Jasocul 8. Jun 2016 07:30

AW: Integerüberlauf bei LongWord
 
@Sir Rufo:
Erklärt aber nicht die Ursache. Du bist doch sonst so gründlich ;) Dein Cast würde übrigens trotzdem den Fehler nicht beheben, wenn w einen Inhalt hat (woher auch immer), der zu einem Integer-Überlauf führt.

@Ing:
Hast du denn mal den Debugger bemüht und nachgesehen, was vor der Zuweisung in den Variablen steht? Hast du vielleicht eine der Variablen nochmal woanders (global oder in TForm1) definiert?

Lemmy 8. Jun 2016 07:42

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
w:= -w;
wäre das so, aber nicht hier.

das stimmt, aber er multipliziert einen Longword mit -1 und was ist das Ergebnis? ein Longword.

Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Und ich bekomme hier ehrlich gesagt auch keinen Überlauf. Welche Delphi-Version, welche Plattform? (Windows/Mac/... bzw. 32/64 Bit?)

schalte mal in den Compileroptionen die Überlaufprüfung ein.

Lemmy 8. Jun 2016 07:51

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Sir Rufo (Beitrag 1339720)
Ein Cast mit
Delphi-Quellcode:
i := - Integer( w );
sollte funktionieren.

wenn man funktionieren mit "da kommt jetzt keine Exception mehr" übersetzt dann ja:

Delphi-Quellcode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w:LongWord;
    i:Integer;
begin
  w:= High(LongWord);
  i:=-Integer(w);
  ShowMessage(IntToStr(w)+' / '+IntToStr(i));
end;
Das dürfte aber nur in bestimmten Fällen kein Problem sein :-)

Jasocul 8. Jun 2016 07:58

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Lemmy (Beitrag 1339722)
Zitat:

Zitat von Der schöne Günther (Beitrag 1339713)
Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
w:= -w;
wäre das so, aber nicht hier.

das stimmt, aber er multipliziert einen Longword mit -1 und was ist das Ergebnis? ein Longword.

Nein. Ich glaube du verwechselt da was. Es gibt da Phänomene bei der Multiplikation ... Aber das hat hiermit nichts zu tun.

Zitat:

Zitat von Lemmy (Beitrag 1339722)
schalte mal in den Compileroptionen die Überlaufprüfung ein.

War auch mein erster Verdacht. Habe es getestet und es hat ohne Fehler funktioniert.

hoika 8. Jun 2016 08:01

AW: Integerüberlauf bei LongWord
 
Hallo,
ich denke, der Hinweis mit der Überlaufprüfung hilft hier.
Wenn im alten Programm keine Fehlermeldung kam,
war dort vielleicht die Prüfung ausgeschaltet?


Heiko

Lemmy 8. Jun 2016 08:43

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Jasocul (Beitrag 1339726)
Zitat:

Zitat von Lemmy (Beitrag 1339722)
schalte mal in den Compileroptionen die Überlaufprüfung ein.

War auch mein erster Verdacht. Habe es getestet und es hat ohne Fehler funktioniert.

Delphi 5 oder Delphi 7 verwendet? In neueren Delphis (habe hier gerade XE4) kommt kein Überlaufsfehler mehr....

Jasocul 8. Jun 2016 08:53

AW: Integerüberlauf bei LongWord
 
@Lemmy:
Da habe ich gepennt. Habe natürlich mit XE2 getestet. Was Anderes habe ich hier nicht zur Verfügung.

ing 8. Jun 2016 09:20

AW: Integerüberlauf bei LongWord
 
Hallo Lemmy,
Ich habe jetzt mal die Bereichsprüfung und die Überlaufprüfung ausgeschaltet mit {$R-,Q-}
Der Fehler tritt immer noch auf.

Außerdem:
In der Graphics.pas steht folgender Code:
Delphi-Quellcode:
procedure TBitmap.ReadDIB(Stream: TStream; ImageSize: LongWord);
...
RLEStream.Seek(-ImageSize, soFromEnd);
....
Auch hier mommt seit Kurzem der Runtime-Error.

Lemmy 8. Jun 2016 10:03

AW: Integerüberlauf bei LongWord
 
bei mir in Delphi 7 steht da:

Delphi-Quellcode:
          { Cast ImageSize (long word) to integer to avoid integer overflow when negating. }
          RLEStream.Seek(-Integer(ImageSize), soFromEnd);
Insofern wird sich ggf. das Compilerverhalten an der Stelle in den neuen Delphis inzwischen verändert haben....


Zitat:

Auch hier mommt seit Kurzem der Runtime-Error.
schau mal in den Projekteigenschaften nach, ob da die Bereichs- und Überlaufprüfung eingeschaltet ist und schalte die dort aus...

ing 8. Jun 2016 10:50

AW: Integerüberlauf bei LongWord
 
Bereichs- und Überlaufprüfung sind sowohl in den Project-Einstellungen
wie auch im Code ( mit {$R-,Q-} ) ausgeschaltet.
Trotzdem tritt der Fehler auf

Lemmy 8. Jun 2016 11:21

AW: Integerüberlauf bei LongWord
 
war es schon immer ausgeschaltet oder hast Du es ausgeschaltet? Und hast Du das Projekt schon mal neu erstellt / vollständig compiliert? Hast Du die dcus schon mal gelöscht (also die dcus der Projektsourcen und nicht von irgend welchen Komponenten von denen du nur die dcus hast)?

ing 8. Jun 2016 13:05

AW: Integerüberlauf bei LongWord
 
Zitat:

Zitat von Lemmy (Beitrag 1339742)
war es schon immer ausgeschaltet oder hast Du es ausgeschaltet?

Ursprünglich war es eingeschaltet. Ich habe es dann probehalber mal ausgeschaltet.

Nachdem ich nun ein paar Mal mit den Optionen "Bereichsprüfung" und "Overflow checking" herumgespielt habe scheint jetzt wieder alles zu funktionieren:

Wenn die Optionen eingeschaltet sind, kommt eine Fehlermeldung.
Wenn die Optionen ausgeschaltet sind, läuft alles ohne Fehler durch.

Warum ich vorher die Probleme hatte kann ich also nicht mehr nachvollziehen.
Aber Danke ann alle, die mir bei der fehlersuche geholfen haben.

Ing

himitsu 8. Jun 2016 15:05

AW: Integerüberlauf bei LongWord
 
Delphi rechnet immer erst mit dem QuellTyp weiter, bzw. mit dem kleinsten "gemeinsamen" Typ, der bei der jeweiligen Teiloperation nötig ist.

LongWord > Negation Unäre Operation > LongWord (und das kann nicht negativ sein) > Zuweisung > Integer/LongInt (da Zieltyp = Integer)

Delphi-Quellcode:
i := -Integer(W); // geht nur, wenn W < 2 Milliarden (maximal 31 Bit genutzt)

i := -Int64(W); // falls an "richtig" rechnen muß

// oder du schaltest die Bereichsprüfung ab, bzw. bzw gezielt dort an, wo sie auch nötig ist


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