2010-03-10 8 views
5

i Bit-Code, der einen Unterlauf verursacht:

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

    delta := (t2 - t1); 

Die Subtraktion selbst hat einen Überlauf erzeugen (Unterlauf), aber ich Delphi eine EIntOverflow Ausnahme zu werfen, nicht wollen. Also versuche ich, die Erzeugung von Überlauf-Prüfcodes Deaktivierung durch Überlaufprüfung zu deaktivieren:

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

{$OVERFLOWCHECKS OFF} 
    delta := (t2 - t1); 
{$OVERFLOWCHECKS ON} 

Doch auch mit der OVERFLOWCHECKS OFF Option, es wirft immer noch eine Ausnahme. Und der generierte Code enthält immer noch die Kontrolle:

alt text http://i43.tinypic.com/intmrl.jpg

eine Erinnerung an die Dokumentation auf $Q:

Überlaufprüfung

Typ Schalter
Syntax { $ Q +} oder {$ Q-}
{$ OVERFLOWCHECKS ON} oder {$ OVERFLOWCHECKS OFF}
Standard {$ Q-}
{$ OVERFLOWCHECKS OFF}
Scope Lokale

Bemerkungen

Die $ Q Direktive steuert die Generierung von Überlaufprüfcode. Im {$ Q +} Zustand, bestimmte ganze Zahl arithmetische Operationen (+, -, *, Abs, Sqr, Succ, Pred, Inc und Dezember) sind für Überlauf geprüft. Der Code für jeder dieser ganzzahligen arithmetischen Operationen wird von zusätzlichen Code gefolgt, der überprüft, dass das Ergebnis innerhalb des unterstützten Bereichs ist. Wenn eine Überlaufprüfung fehlschlägt, wird eine EIntOverflow Ausnahme ausgelöst (oder das Programm ist beendet, wenn die Ausnahmebehandlung nicht aktiviert ist).

Die $ Q-Schalter wird in der Regel in Verbindung mit dem $ R-Schalter verwendet, die aktiviert und deaktiviert die Erzeugung von Entfernungs-Prüfcodes. Aktivieren Überlauf Überprüfung verlangsamt Ihr Programm und macht es etwas größer, so verwenden Sie {$ Q +} nur zum Debuggen.

Wie verwende ich $OVERFLOWCHECKS OFF, um die Generierung von Überlaufprüfcode zu deaktivieren?


Masons Antwort funktionierte.Der überarbeitete Code ist:

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 Überlaufprüfung in Delphi deaktivieren?

Antwort

12

Es funktioniert nicht auf Zeilenebene. Sie müssen es für die gesamte Funktion ausschalten.

+0

Ich wäre sehr interessiert zu sehen, die Dokumentation zu dieser und anderen anderen Compiler-Optionen - speziell '$ RANGECHECKS' ... Aber +1" Diese Antwort ist nützlich) –

+3

Bereichsprüfung * funktioniert * auf der Leitungsebene. Die Überfüllungsüberprüfung funktioniert nur auf der Funktionsebene, und die Einstellung, die zum Zeitpunkt des Erreichens des Endes des Compilers in Kraft ist, ist derjenige, der den Maschinencode der gesamten Funktion erzeugt, aber das ist nicht dokumentiert, aber so hat es für immer funktioniert Die Optimierung funktioniert auch nur auf der Funktionsebene, das ist dokumentiert –

+0

Ich kam von einem Delphi-Code, der {$ Q +/-} auf Leitungsebene verwendete, indem ich wie in der Antwort erwähnt zu {$ OVERFLOWCHECKS ON/OFF} wechselte oben, aber mit ihnen die gesamte Funktion umgeben, wie diese Antwort darauf hinweist, konnte ich die Überlaufprüfung deaktivieren, aber ich musste die Leitungsebene {$ Q +/-} c entfernen ompiler-Anweisungen, die schon da waren oder ich noch Überlauf habe Ausnahmen. –

Verwandte Themen