Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 06:45 Uhr.
Seite 2 von 2     12   

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