2010-03-10 10 views
5

tengo algo de código que provoca un desbordamiento:

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

    delta := (t2 - t1); 

La resta sí qué generan un desbordamiento (desbordamiento), pero yo no quiero Delphi para lanzar una excepción EIntOverflow. Así que trato de deshabilitar la generación de código de comprobación de desbordamiento mediante la desactivación de la comprobación de desbordamiento:

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

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

Sin embargo, incluso con la opción OVERFLOWCHECKS OFF, todavía se produce una excepción. Y el código generado todavía contiene el cheque:

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

Un recordatorio de la documentación sobre $Q:

desbordamiento comprobar

Tipo Interruptor
Sintaxis { $ Q +} o {$ Q-}
{$ OVERFLOWCHECKS on} o {$ OVERFLOWCHECKS OFF}
defecto {Q} $ {$
OVERFLOWCHECKS off}
Ámbito Local

Observaciones

El $ Q La directiva controla la generación del código de comprobación de desbordamiento. En el estado {$ Q +}, cierto número entero operaciones aritméticas (+, -, *, ABS, Sqr, Suc, Pred, Inc y diciembre) están comprobado para el desbordamiento. El código para en cada una de estas operaciones de aritmética entera es seguido por un código adicional que verifica que el resultado es dentro del rango admitido. Si falla una verificación de desbordamiento , se genera una excepción EIntOverflow (o el programa es terminado si el manejo de excepciones es no habilitado).

interruptor La $ Q se utiliza generalmente en junto con el interruptor $ R, que Activa y desactiva la generación de código gama de comprobación. Habilitar el desbordamiento comprobando ralentiza su programa y lo hace algo más grande, entonces use {$ Q +} solo para la depuración.

¿Cómo uso $OVERFLOWCHECKS OFF para desactivar la generación de código de verificación de desbordamiento?


La respuesta de Mason funcionó.El código revisado es:

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} 

para Google rastreador, se alternan pregunta redacción: Cómo desactivar temporalmente la comprobación de desbordamiento en Delphi?

Respuesta

12

No funciona en el nivel de línea. Debe apagarlo para toda la función.

+0

estaría muy interesado en ver la documentación sobre esta y otras opciones del compilador, específicamente '$ RANGECHECKS' ... Pero +1" Esta respuesta es útil) –

+3

La verificación de rango * no funciona en el nivel de línea. La verificación de desbordamiento solo funciona en el nivel de función. Cualquiera que sea la configuración vigente al momento en que el compilador llegue al 'fin 'será la que se utilizó para generar el código de máquina de la función entera. No está documentado de esa manera, pero esa es la forma en que funcionó para siempre . La optimización también solo funciona en el nivel de función; eso está documentado. –

+0

Llegué aquí de un código de Delphi que estaba usando {$ Q +/-} en el nivel de línea. Al cambiar a {$ OVERFLOWCHECKS ON/OFF} como se menciona en la respuesta más arriba, pero usándolas para rodear toda la función como lo indica esta respuesta, pude desactivar la verificación de desbordamiento. Sin embargo, tuve que eliminar el nivel de línea {$ Q +/-} c las directivas ompiler que ya estaban allí o todavía tengo excepciones de desbordamiento. –

Cuestiones relacionadas