Delphi: Comment utiliser OVERFLOWCHECKS $ OFF pour désactiver les contrôles de débordement?
-
19-09-2019 - |
Question
J'ai peu de code qui provoque un dépassement:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := (t2 - t1);
La soustraction se fait provoquer un débordement (underflow), mais je ne veux pas Delphi pour lancer une exception EIntOverflow
. Donc, j'essayez de désactiver la génération de code de vérification de débordement en désactivant le contrôle de débordement:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
{$OVERFLOWCHECKS OFF}
delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
Pourtant, même avec l'option OVERFLOWCHECKS OFF
, il jette encore une exception. Et le code généré contient encore la vérification:
Un rappel de la documentation sur $Q
:
dépassement de capacité de vérification
Type Commutateur
Syntaxe {$ Q +} ou {$} Q-
{$ OVERFLOWCHECKS ON} ou {OFF} OVERFLOWCHECKS $
Par défaut {$} Q-
{OVERFLOWCHECKS $ OFF}
Portée LocalRemarques
La directive Q $ contrôle la génération de code de vérification de trop-plein. Dans l'état {$ Q +}, certains entier opérations arithmétiques (+, -, *, Abs, SQR, Succ, Pred, Inc et décembre ) sont vérifié en cas de débordement. Le code chacun de ces arithmétique entière opérations est suivie supplémentaire code qui vérifie que le résultat est dans la plage prise en charge. Si un ne contrôle de trop-plein, un EIntOverflow exception est levée (ou le programme est fin si la gestion des exceptions est non activé).
Le commutateur Q $ est habituellement utilisé en conjointement avec le commutateur de R $, ce qui active et désactive la génération de vérification du code gamme. débordement Activation Ralentissement de la vérification et votre programme rend un peu plus, alors utilisez {$ Q +} uniquement pour le débogage.
Comment utiliser $OVERFLOWCHECKS OFF
pour désactiver la génération de code de vérification de débordement?
La réponse de
Mason a travaillé. Le code révisé est:
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}
Pour crawler google, phrasé question alternative: Comment désactiver temporairement le contrôle débordement dans Delphi
La solution
Il ne fonctionne pas au niveau de la ligne. Vous devez désactiver pour toute fonction.