1

我在 Pascal 中实现邻接列表(首先读取边缘端点,然后使用动态数组将所需的内存量分配给每个节点的边缘列表)。程序执行良好,输出正确,但在退出前给出运行时错误 216。
代码是:

type aptr = array of longint;
var edgebuf:array[1..200000,1..2] of longint;
    ptrs:array[1..100000] of longint;
    i,j,n,m:longint;
    elist:array[1..100000] of aptr;

{main}
begin
    readln(n,m);
    fillchar(ptrs,sizeof(ptrs),#0);
    for i:=1 to m do begin
    readln(edgebuf[i][1],edgebuf[i][2]);
    inc(ptrs[edgebuf[i][1]]);
    end;
    for i:=1 to n do begin
    setlength(elist[i],ptrs[i]);
    end;
    fillchar(ptrs,sizeof(ptrs),#0);

    for i:=1 to m do begin
    inc(ptrs[edgebuf[i][1]]);
    elist[edgebuf[i][1]][ptrs[edgebuf[i][1]]]:=edgebuf[i][2];
    end;

    for i:=1 to n do begin
    writeln(i,' begins');
    for j:=1 to ptrs[i] do begin
        write(j,' ',elist[i][j],' ');
    end;
    writeln();
    writeln(i,' ends');
    end;
    writeln('bye');
end.

在文件上运行时

4 5
1 2
3 2
4 3
2 1
2 3

给出输出:

1 begins
1 2 
1 ends
2 begins
1 1 2 3 
2 ends
3 begins
1 2 
3 ends
4 begins
1 3 
4 ends
bye
Runtime error 216 at $0000000000416644
  $0000000000416644
  $00000000004138FB
  $0000000000413740
  $0000000000400645
  $00000000004145D2
  $0000000000400180

一旦程序说“再见”,正在执行的程序是什么导致运行时错误 216?

4

1 回答 1

1

RTE 216 通常是致命的例外。GPF/SIGSEGV 和某些情况下的 SIGILL/SIGBUS,这可能意味着您的程序在某处损坏了内存。

使用运行时检查进行编译可能会帮助您发现错误(Free Pascal:-Criot)

于 2013-06-03T15:35:18.850 回答