2016-08-25 4 views

답변

3

내부 오류는 컴파일러 오류입니다. 우리는 그들을 해결할 수 없으며 컴파일러 개발자 만 그렇게 할 수 있습니다. Embarcadero에 버그 보고서를 제출해야합니다. XE3의 고대 성을 감안할 때 수정 사항을받을 가능성은 거의 없습니다.

최신 버전의 Delphi에서는 메모리 오류가 발생하기 쉽지 않으므로 업그레이드가 옵션 인 경우 문제가 발생할 가능성이 있습니다.

업그레이드가 불가능한 경우 이러한 오류 중 하나가 발생할 때마다 계속 혼란스러워하고 저주해야합니다.

2

이것은 실제로 매우 일반적입니다 (적어도 이러한 종류의 오류는 매우 자주 발생했습니다). 필자는 작업을 컴파일 할 때까지 DPK에서 소스 코드 파일을 단계적으로 제거하는 접근 방식을 사용했습니다. 이 방법을 사용하면 어떤 파일이 이러한 오류의 원인인지 알 수 있습니다. 그런 다음 문제가되는 행을 찾을 때까지이 파일의 소스 코드 부분을 단계적으로 주석 처리 한 다음 다시 작성하십시오 (직접 찾아야하는 방식으로).

2

David Heffernan이 이미 말했듯이, 오류는 컴파일러 나 링커 내부에 있기 때문에 실제로 해결할 방법은 없으며 이것들의 개발자 만이 버그를 제거 할 수 있습니다.

그러나 종종 몇 가지 해결 방법이 있습니다.

내 경험에 비추어 볼 때 이러한 내부 오류는 제네릭 및 익명 메서드 또는 인라인 된 코드와 관련이 있습니다. 특히 두 개 또는 전부를 결합하면 더욱 그렇습니다.

내부 오류가 발생하기 전에 어떤 코드를 변경했는지 확인하십시오. 버전 관리 시스템 또는 Delphi의 내부 _history 시스템을 사용하는 경우 오류가 사라질 때까지 이전 버전으로 복원하십시오. 그런 다음 "위반하는"코드와 다른 점을 확인하고 내부 오류를 일으킨 코드를 확인할 수 있습니다.

너무 복잡한 표현식 (특히 위에서 언급 한 유형의 경우)으로 인해 내부 오류가 발생할 수 있습니다. 이 경우 먼저 하위 표현식을 계산하여 표현식을 단순화하십시오. 또한, 대신

x := TList<SomeType<Integer>>.Create; 

같은 임시 일반적인 선언을 사용하면 미리 정의 된 유형을 사용하려고합니다 찾을 즉

type 
    SomeTypeInteger = SomeType<Integer>; 
    SometypeList = TList<SomeTypeInteger>; 

    ... 

    x := SometypeList.Create; 

,

  • 시도를 " 당신이 그것을 발견하면
  • 이 사라질 때까지 역사에서 돌아가서 코드 "코드"를 단순화하려고 시도해보십시오. 식을 풀다하고 오류가 멀리

당신이 그렇게한다면, 당신은 내부 오류를 방지에서 성공 수를 때까지 종류에게 코드를 표현하는 다른 방법으로

  • 실험을 미리 정의.종종 시간이 걸렸지 만, 내가 원하는 것을 성취 할 길을 찾았습니다. 가능하지 않은 경우 여기에서 구체적인 오류에 대해 물어보십시오 (위반 코드를 게시하여 정확한 오류 및 가능한 경우 Minimal, Complete, and Verifiable example).

    다행히도 최신 컴파일러에서는 이러한 오류가 거의 발생하지 않습니다.