Delphi: Comment utiliser OVERFLOWCHECKS $ OFF pour désactiver les contrôles de débordement?

StackOverflow https://stackoverflow.com/questions/2418272

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 Local

     

Remarques

     

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

Était-ce utile?

La solution

Il ne fonctionne pas au niveau de la ligne. Vous devez désactiver pour toute fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top