Delphi: Wie verwende ich OVERFLOWCHECKS $ OFF Überlauf überprüft zu deaktivieren?
-
19-09-2019 - |
Frage
ich habe wenig Code, der eine Unterschreitung führt:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := (t2 - t1);
Die Subtraktion selbst hat einen Überlauf (Unterlauf) erzeugen, aber ich möchte nicht, Delphi eine EIntOverflow
Ausnahme werfen. Also versuche ich, die Erzeugung von Überlauf zu deaktivieren durch Deaktivieren Überlaufprüfung Prüfungscode:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
{$OVERFLOWCHECKS OFF}
delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
Doch auch mit der OVERFLOWCHECKS OFF
Option, wirft es nach wie vor eine Ausnahme. Und der generierte Code enthält noch die Kontrolle:
Eine Erinnerung an die Dokumentation auf $Q
:
Überlaufprüfung
Typ Schalter | Syntax {$ Q +} oder {$ Q-}
{$ OVERFLOWCHECKS ON} oder {OVERFLOWCHECKS AUS $}
Standard {$ Q-}
{$ OVERFLOWCHECKS OFF}
Anwendungsbereich LokalBemerkungen
Die $ Q-Richtlinie regelt die Erzeugung von Überlaufprüfung Code. Im {$ Q +} Zustand, bestimmte ganze Zahl arithmetische Operationen (+, -, *, Abs, Sqr, Succ, Pred, Inc und Dezember ) sind geprüft für Überlauf. Der Code für jeder dieser ganzzahligen Arithmetik Operationen durch zusätzliche gefolgt Code, dass das Ergebnis überprüft, ist innerhalb des unterstützten Bereichs. Wenn ein Überlaufprüfung fehlschlägt, ein Eintoverflow Ausnahme angehoben wird (oder das Programm ist, wenn die Ausnahmebehandlung beendet ist nicht aktiviert).
Das $ Q-Schalter in der Regel verwendet in Verbindung mit dem $ R-Schalter, der aktiviert und deaktiviert, die Erzeugung von Bereichsprüfungscode. Aktivieren der Überlauf Überprüfung verlangsamt Ihr Programm und macht es etwas größer, so verwenden {$ Q +} nur für die Fehlersuche.
Wie verwende ich $OVERFLOWCHECKS OFF
die Erzeugung von Überlauf-Prüfcodes zu deaktivieren?
Mason Antwort gearbeitet. Der überarbeitete Code lautet:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := Subtract(t2, t1);
{$OVERFLOWCHECKS OFF}
function Subtract(const B, A: DWORD): DWORD; //subtract B-A
begin
{
Disabling overflow checking does not work at the line level,
only the routine level.
Hence the function to subtract two numbers.
}
Result := (B-A);
end;
{$OVERFLOWCHECKS ON}
Für Google-Crawler, alternative Frage Phrasierung: Wie vorübergehend Überlauf deaktivieren Überprüfung in Delphi
Lösung
Es funktioniert nicht auf der Linie Ebene. Sie müssen, um sie auszuschalten für die gesamte Funktion.