사용자 정의 수의 행에 대해 파스칼의 삼각형을 계산, 표시 및 저장하는 프로그램을 Delphi로 작성했습니다. 그것은 결국 액세스 위반이 발생한다는 것을 제외하고는 잘 동작합니다 (삼각형을 표시하고 저를 저장할 수 있습니다)! 다음은 메시지입니다.성공적인 실행 후에 델파이에서 액세스 위반이 발생했습니다.
'Project1.exe'모듈의 주소가 004031DB 인 액세스 위반이 있습니다. 주소 00000000 읽기.
절차에서 2D 동적 배열이 있지만 끝에 메모리를 해제합니다 (: = nil). 왜 여전히 내게 액세스 위반을주고 있습니까? 매우 좌절!
아카이브에 대한 답변을 검색했지만 적절한 답변을 찾을 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 여기
코드 (코드의 비트가 나는 조금 주저했다입니다.procedure TForm1.btnPTClick(Sender: TObject);
var
I, J, K, N, MidCol: integer;
PT: array of array of integer;
Row: string;
begin
K := StrToInt(lblNumRows.Text);
N := StrToInt(lblNumRows.Text);//# values in row = row number
try
//initiatlize the array
SetLength(PT, K, (N*2)-1);
for I := 0 to K-1 do
for J := 0 to (N*2-1) do
PT[I,J] := 0;
MidCol := (N*2 div 2)-1;//MidCol already 0-based
for I := 0 to K-1 do
begin
if (I = 0) then
PT[I,MidCol] := 1//first row gets 1 in the middle column
else if I = 1 then
begin
PT[I,MidCol-1] := 1;
PT[I,MidCol+1] := 1; //first and last value in second = 1
end
else //if any other row
begin
//Middle column
PT[I, MidCol] := PT[I-1,MidCol-1] + PT[I-1,MidCol+1];
//right triangle
for J := MidCol+1 to (N*2-1) do
begin
if (PT[I-1, J-1]=1) then//if already at the end of prev row
begin
PT[I,J] := 1;
break;
end
else
PT[I,J] := PT[I-1,J-1] + PT[I-1,J+1];
end;
//left triangle
for J := MidCol-1 downto 0 do
begin
if (PT[I-1, J+1] = 1) then //if already at the end of prev row
begin
PT[I,J] := 1;
break;
end
else
PT[I,J] := PT[I-1,J-1] + PT[I-1,J+1];
end;
end;
end;
//now add the pyramid to the memo
Application.ProcessMessages;
for I := 0 to K-1 do
begin
Row := '';
for J := 0 to N*2-1 do
begin
if (PT[I,J] = 0) then Row := Row + ' '
else Row := Row + IntToStr(PT[I,J]);
end;
Memo.Lines.Add(Row);
end;
finally
SetLength(PT, 0, 0);
end;
end;
코드를 보지 않고 말하는 것은 완전히 불가능합니다. 당신은 out-of-bound 배열 인덱스에 쓰지 않으시겠습니까? 어쩌면 이전에 해제 된 (또는 아직 생성되지 않은) '객체'를 사용할 수 있습니까? –
@ user1505202 : 언어가 관리하는 객체이므로 배열에서 : = nil을 제거하고 더 이상 필요하지 않을 때 적절하게 처리합니다. – AlexSC
동일한 객체를 두 번 해제하려고하거나 이미 오류가 발생했기 때문에 오류가 발생했을 수 있습니다. 해방? –