2012-05-06 7 views
0

나는 델파이에서 유효하지 않은 포인터 연산에 관한 대부분의 게시물을 읽었으며이 경우에는 적용되지 않는 것으로 보인다 ... 재판과 오류로 인해 문제가되는 줄을 알게되었지만 아무런 의미가 없다. 나를. 이 예제에서는 텍스트 파일을 구문 분석 할 때 텍스트 파일의 내용으로 동적 레코드 배열을 채 웁니다. 동적 배열에 할당 된 메모리가 해제 될 때를 제외하고 모든 것이 완벽하게 작동합니다.이 경우 "잘못된 포인터 연산"이 수신됩니다. 문제의 라인을 ifthen 구문에서 고전적인 if-then으로 변경하면 작동합니다.델파이 XE에서 잘못된 포인터 연산 - IFTHEN 때문에?

내 질문은 간단합니다. 왜 첫 번째 메모리가 메모리를 해제하지 못하게하지만 두 번째 메모리가 성공합니까?

제 1 예 :

TempFTDB[ci].FTText := ifthen(TempHolder = '', '', TempHolder + #13#10) + lr; 

번째 예 :

if tempholder = '' then 
    TempFTDB[ci].FTText := lr 
else 
    TempFTDB[ci].FTText := tempholder + #13#10 + lr; 

메모리를 해제 선은 :

TempFTDB := nil; 

또한 설명 : TempFTDB 로컬 변수 및 거기 메모리를 비우는 다른 라인은 없다. "TempFTDB : = nil"행에 오류가 발생합니다. IfThen 방법은 두 문자열을 기대 때문에 메서드 서명에 볼 수 IfThen을 사용하여 문제의

+0

새 프로젝트로 이것을 복제 할 수 있습니까? –

+1

어떤 유형이'TempFTDB'입니까? 그리고'TempFTDB : = nil' 라인에서 에러가 발생하면, FTText를 어떻게 설정해야합니까? – NGLN

+0

@NGLN - TempFTDB는 레코드의 배열입니다. FTText는 레코드 –

답변

0

일반적으로 이런 종류는 다음과 같습니다

function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string; 

당신이 게시 코드가 실제 인 경우 나도 몰라 코드,하지만 나는 "거짓"값이 잘못된 상태이며, IfThen 메서드는 모두 조건을 항상 실행한다고 추측 할 수 있습니다.

따라서 "거짓"값에 메서드를 전달하는 경우이 메서드는 실행 조건이 false 인 경우에 따라 달라 지므로 항상이 실행되므로 예기치 않은 동작이 발생할 수 있습니다.

0

좋아요 ... 위가 붉은 청어였습니다. 위에서 언급 한 루틴 (위에서 발췌 한)이 두 번째로 실행될 때마다 오류가 다시 발생했습니다. 할당되지 않은 메모리와 같은 것 같습니다. 위의 코드를 작성하기 직전에 임시 레코드 배열에서 항목의 번호를 다시 매기는 루틴이있었습니다. 문제 (당황 작은 실수 ..)

내가 가진 :

for i := 0 to length(FTDBFileBuffer_RTF) do 
    begin 
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber; 
    end; 

대신

for i := 0 to length(FTDBFileBuffer_RTF) - 1 do //notice the - 1 
    begin 
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber; 
    end; 

이제 문제는 ... 단지 학문적 왜 존재는 것 또는 ab ifthen 명령을 사용하면 오류가 강제로 표시됩니까?

+0

의 짧은 문자열 필드입니다. 할당되지 않은 메모리 영역에 레코드를 쓸 때와 같이 메모리가 잘못 덮어 쓰면 오류가 발생합니다. –