2011-03-28 12 views
5

Después de pasar una semana revisando y reparando mi programa para detectar fugas de memoria a través de FastMM4, finalmente realicé la prueba ejecutando mi programa en una PC diferente. Ahora recibo el "Error de comprobación de rango". He pasado horas investigando en línea sobre esto, pero ninguno de ellos parece darme lo que estoy buscando. Mi programa se cumplió con la opción Range Error Error Range Check. Entonces, sé que es por eso que recibo el error, pero necesitaba saber exactamente por qué se produjo el error.Range Check Error y Delphi 7.0

El programa se compiló en XP con Delphi 7.0. La PC de prueba es Windows 7. Tan pronto como se inicia, mi programa comienza a comunicarse a través del puerto serie y luego sigue con los cuadros de mensaje "Error de comprobación de rango". Cuando detengo la comunicación serial, no hay cuadros de "Error de verificación de rango". ¿Qué significa esto y cómo lo hago para resolverlo? Estoy buscando una estrategia simple. Sé que podría pasar días comprobando línea por línea.

"Error de comprobación de rango" causado por la asignación incorrecta de valores o al acceder al índice inaccesible de una matriz. ¿Estoy en lo correcto?

+0

¿Puede instalar Delphi en la otra máquina y depurarlo? – Blorgbeard

+0

Mejor aún, estoy pensando en limitarme a la línea ofensiva de código comentando secciones de código y recompilando. Luego, pruebe ejecutar el programa en la PC con Windows 7. Sé que va a ser tedioso, pero creo que sé qué parte del programa está teniendo lugar. – ThN

+0

¿Por qué no encuentra la línea ofensiva con el archivo del mapa como sugerí? –

Respuesta

8

Su comprensión de los errores de comprobación de rango es correcta. Surgen cuando accede a una matriz fuera de sus límites. Por ejemplo:

type 
    TFixedArray = array [0..41] of Integer; 
var 
    a: TFixedArray; 
begin 
    a[42] := 1+2;//!! this is a range check error !! 
end; 

O para una matriz dinámica:

var 
    a: array of Integer; 
begin 
    SetLength(a, 666); 
    a[665] := 12;//this is fine 
    a[666] := 42;//!! this is a range check error !! 
end; 

he ilustrado esto con asignación, pero la lectura de una matriz con un índice fuera de límites también producirá un error de rango.

El error de rango debe informar una dirección en la que aparece, que luego puede traducir a una ubicación de código con su archivo de mapa. Aún mejor sería si estuvieras usando madExcept o alguna de esas herramientas.


ACTUALIZACIÓN

Impulsados ​​por Ken, el documentation establece lo que se ve afectada por la opción de comprobación de rango de la siguiente manera:

En el estado {$ R +}, toda matriz y las expresiones de indexación de cadena son verificadas como dentro de los límites definidos, y todas las asignaciones a las variables escalares y subrango están marcadas para estar dentro del rango.

+0

Solo una adición: en el estado {$ R +}, todas las expresiones de matriz e indización de cadena se verifican dentro de los límites definidos, y se verifica que todas las asignaciones a las variables escalares y de subintervalo estén dentro del rango. Tenga en cuenta la 'cadena de indexación' y' escalar y suborganizar variables'. –

+0

sus ejemplos son fantásticos, pero ¿tiene que usar "666". LOL. – ThN

+1

+1 para este ejemplo diabólico: D –

0

Después de leer otra información sobre el concepto de "error de comprobación de rango", creo que la razón para hacer que el "error de comprobación de rango" en este scenerio es que: la asignación variable para acceder al puerto serie del programa reads es un tipo de 16 bytes (o más pequeño), y el puerto serie que el programa lee excede la limitación de la variable. Observe que [Cuando detengo la comunicación serial, no hay cuadros de "Error de comprobación de rango"], esto debería aclarar todas las cosas.