![]() |
Integerüberlauf bei LongWord
Hallo,
Bei folgender Zuweisung bekomme ich einen Runtime Error (Integerüberlauf):
Delphi-Quellcode:
Ich bin mir sicher, dass dieser Code bisher funktioniert hat.
procedure TForm1.Button1Click(Sender: TObject);
var w:LongWord; i:Integer; begin w:=3; i:=-w; // <-- Integerüberlauf ShowMessage(IntToStr(w)+' / '+IntToStr(i)); end; Hat jemand eine Idee wo hier der Fehler liegt? Danke, ing |
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! :-) |
AW: Integerüberlauf bei LongWord
Hallo :party:
Er steckt in die LongWord-Variable aber keine negativen Werte rein. Bei Dingen wie
Delphi-Quellcode:
wäre das so, aber nicht hier.
w:= -w;
Und ich bekomme hier ehrlich gesagt auch keinen Überlauf. Welche Delphi-Version, welche Plattform? (Windows/Mac/... bzw. 32/64 Bit?) |
AW: Integerüberlauf bei LongWord
Hallo Lemmy,
Zitat:
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 |
AW: Integerüberlauf bei LongWord
Zitat:
|
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 |
AW: Integerüberlauf bei LongWord
Ein Cast mit
Delphi-Quellcode:
sollte funktionieren.
i := - Integer( w );
|
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? |
AW: Integerüberlauf bei LongWord
Zitat:
Zitat:
|
AW: Integerüberlauf bei LongWord
Zitat:
Delphi-Quellcode:
Das dürfte aber nur in bestimmten Fällen kein Problem sein :-)
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; |
AW: Integerüberlauf bei LongWord
Zitat:
Zitat:
|
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 |
AW: Integerüberlauf bei LongWord
Zitat:
|
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. |
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:
Auch hier mommt seit Kurzem der Runtime-Error.
procedure TBitmap.ReadDIB(Stream: TStream; ImageSize: LongWord);
... RLEStream.Seek(-ImageSize, soFromEnd); .... |
AW: Integerüberlauf bei LongWord
bei mir in Delphi 7 steht da:
Delphi-Quellcode:
Insofern wird sich ggf. das Compilerverhalten an der Stelle in den neuen Delphis inzwischen verändert haben....
{ Cast ImageSize (long word) to integer to avoid integer overflow when negating. }
RLEStream.Seek(-Integer(ImageSize), soFromEnd); Zitat:
|
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 |
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)?
|
AW: Integerüberlauf bei LongWord
Zitat:
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 |
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