Aquí hay una versión condensada de algún código que causa tanto un error de comprobación de rango como un error de desbordamiento, si enciendo esas directivas de verificación de compilador. Entiendo por qué esto causaría un desbordamiento, en la multiplicación de C1, parece probable que pueda exceder el valor máximo del tipo de datos. ¿Pero por qué esto también desencadenaría un error de Range-check? La documentación de Delphi y otras publicaciones sobre el desbordamiento de la pila hacen que parezca que los errores de comprobación de rango son generalmente para los accesos de matriz que están fuera de los límites. Pero no estoy accediendo a una matriz en la línea que está diciendo que está causando el error de verificación de rango. Tal vez es en la asignación a param1? Pero, ¿por qué sería eso un control de rango y no un error de desbordamiento, si es así?Causa del error de comprobación de rango (Delphi)
const
C1 = 44001;
C2 = 17999;
function fxnName(..other params...; param1: Word): String;
var
someByte: byte;
begin
// some code
// by now we're in a loop. the following line is where it breaks to in the debugger:
param1 := (someByte + param1) * C1 + C2;
// more code
end;
Si es relevante, cuando se rompe en esa línea en el depurador, todos los valores se ven como se esperaba, excepto param1, lo que demuestra "identificador no declarado: 'param1'" cuando pido Delphi para evaluarla.
Me sospecho que es sólo porque la prueba de alcance se produce antes de la verificación de desbordamiento, y una vez que el rango se genera una excepción de cheque, la verificación de desbordamiento nunca ocurre. (No estoy seguro del orden, por lo tanto, es solo una sospecha.) –