2011-03-28 6 views
5

FastMM4를 통해 메모리 누수가 있는지 프로그램을 점검하고 수정 한 후, 마침내 다른 프로그램을 테스트했습니다. 이제 "범위 검사 오류"가 나타납니다. 나는 이것에 관해 온라인으로 조사하는 데 많은 시간을 보냈지만, 그들 중 누구도 내가 원하는 것을 나에게주지 않는 것 같다. 내 프로그램은 런타임 오류 옵션 범위 검사를 준수했습니다. 그래서 나는 이것이 내가 오류를 얻는 이유를 알고 있지만, 오류가 제기 된 이유를 정확하게 알아야했습니다.범위 검사 오류 및 델파이 7.0

이 프로그램은 XP에서 Delphi 7.0으로 컴파일되었습니다. 테스트 PC는 Windows 7입니다. 시작하자마자 프로그램이 직렬 포트를 통해 통신을 시작한 다음 "Range Check Error"메시지 상자가 표시됩니다. 시리얼 통신을 중지하면 "Range Check Error"상자가 나타나지 않습니다. 이것이 의미하는 바는 무엇이며 어떻게 해결할 수 있습니까? 나는 간단한 전략을 찾고 있습니다. 나는 줄 단위로 일별 점검을 할애 할 수 있다는 것을 알고있다.

값 범위가 잘못 지정되었거나 액세스 할 수없는 배열 색인에 액세스하여 "범위 검사 오류"가 발생했습니다. 나 맞아?

+0

다른 컴퓨터에 Delphi를 설치하고 디버깅 할 수 있습니까? – Blorgbeard

+0

더 나아가 코드 섹션을 주석으로 처리하고 다시 컴파일하여 문제가되는 코드 줄까지 좁힐 생각입니다. 그런 다음 Window 7 PC에서 프로그램을 테스트 해보십시오. 나는 그것이 지루할 것임을 알지만, 프로그램의 어떤 부분이 일어나고 있는지 알 것 같습니다. – ThN

+0

내가 제안한대로지도 파일에 문제가되는 행을 찾지 않는 이유는 무엇입니까? –

답변

8

범위 검사 오류에 대한 이해가 정확합니다. 배열 밖의 배열에 액세스 할 때 발생합니다. 예를 들어 :

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

또는 동적 배열에 대한

는 :

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; 

나는 할당에이를 설명했지만, 범위를 벗어난 인덱스 배열을 읽어도 범위 오류가 발생합니다.

범위 오류는 발생하는 주소를보고하고지도 파일로 코드 위치로 변환 할 수 있습니다. madExcept 또는 일부 도구를 사용하는 것이 더 좋습니다.


켄하라는 메시지가 UPDATE

documentation 다음과 같이 범위 확인 옵션에 의해 영향을받는 것을 말한다 다음 {$의 R의 +} 상태에서

, 모든 배열 및 문자열 인덱싱 표현식은 이 정의 된 범위 내에있는 것으로 확인되며 스칼라 에 대한 모든 할당과 하위 범위 변수는 범위 내에 있어야합니다. 변수 할당 프로그램 직렬 포트에 액세스 할 수 :

+0

추가 정보 : {$ R +} 상태에서 모든 배열 및 문자열 인덱싱식이 정의 된 범위 내에있는 것으로 확인되고 스칼라 및 하위 범위 변수에 대한 모든 할당이 범위 내에 있는지 확인됩니다. 'string-indexing'과'scalar and subrange variables'에 유의하십시오. –

+0

예제가 환상적이지만 "666"을 사용해야합니다. LOL. – ThN

+1

+1이 악마 같은 예제 : D –

0

내가이 시나리오에는에서 "범위 검사 오류"가 발생하는 이유가 있다는 것을 믿는다 "범위 검사 오류"의 개념에 대한 다른 정보를 읽으면서 reads는 16 바이트 (또는 더 작은) 유형이고 프로그램이 읽는 직렬 포트는 변수의 한계를 초과합니다. [직렬 통신을 중지 할 때 "범위 검사 오류"상자가 없습니다.] 이는 모든 것을 명확하게 만들어야합니다.