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 Lokal

     

Bemerkungen

     

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

War es hilfreich?

Lösung

Es funktioniert nicht auf der Linie Ebene. Sie müssen, um sie auszuschalten für die gesamte Funktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top