I was implementing adjacency list in Pascal (by first reading edge end points, and then using dynamic arrays to assign required amount of memory to edgelist of each node). The program executes fine, gives correct outputs but gives runtime error 216 just before exiting.
The code is :
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.
When run on file
4 5
1 2
3 2
4 3
2 1
2 3
gives output:
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
Once the program says «bye», what is the program executing that is giving runtime error 216?
Модератор: Модераторы
Linux, runtime error 216
Всем добра!
Случилась такая беда — компилятор отказался запускаться, ссылаясь на эту ошибку.
Причём ругается при попытке скомпилировать абсолютно любую программу и при попытке войти в IDE.
Честно говоря, я даже малейшего представления не имею, что могло послужить первоисточником проблемы.
Полная переустановка не возымела результата. Версия с сайта (с install.sh в архиве) даёт аналогичный результат.
Дистрибутив — ArchLinux x86.
Взываю к вашей помощи!
- Rasmussen
- новенький
- Сообщения: 13
- Зарегистрирован: 02.07.2012 21:33:54
Re: Linux, runtime error 216
Ism » 27.10.2012 19:17:36
Ему чегото не хватает, что в командной строке говорит ?
- Ism
- энтузиаст
- Сообщения: 908
- Зарегистрирован: 06.04.2007 17:36:08
Re: Linux, runtime error 216
Rasmussen » 27.10.2012 20:07:29
Консоль, к сожалению, ничего информативного не несёт:
[rasmussen@acm rasmussen]$ fpc
Runtime error 216 at $000000000043F876
$000000000043F876
$0000000000400180
[rasmussen@acm rasmussen]$ fp
Runtime error 216 at $00000000004C3EF5
$00000000004C3EF5[rasmussen@acm rasmussen]$ cd pascal/
[rasmussen@acm pascal]$ fpc if-then.pas
Runtime error 216 at $000000000043F876
$000000000043F876
$0000000000400180
- Rasmussen
- новенький
- Сообщения: 13
- Зарегистрирован: 02.07.2012 21:33:54
Re: Linux, runtime error 216
Максим » 27.10.2012 23:50:48
Прям вот так и отказался, ни с того, ни с сего? ![]()
Вангую, что криво накатили обновление Арчика.
-

Максим - энтузиаст
- Сообщения: 597
- Зарегистрирован: 27.07.2007 01:51:43
- Откуда: Москва
Re: Linux, runtime error 216
Vadim » 28.10.2012 10:10:09
Rasmussen
А Вы из AUR пробовали FPC устанавливать? Там версия тоже свежая лежит — 2.6
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: Linux, runtime error 216
Rasmussen » 28.10.2012 22:38:22
Единственно событие, которое предшетствовало отказу в работе — правка rc.conf под новые требования. Я тогда неверно порписал локаль и после такого впервые заметил проблему.
Проблема в том, что в АУРе он собирается из svn, а при сборке этой версии необходим уже усановленный компилятор.
Между молотом и наковальней, словом!
- Rasmussen
- новенький
- Сообщения: 13
- Зарегистрирован: 02.07.2012 21:33:54
Re: Linux, runtime error 216
Vadim » 29.10.2012 11:54:53
Rasmussen
А Вы по какой ссылке качали FPC с сайта?
У Вас 32-ух или 64-ёх разрядная ОС?
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: Linux, runtime error 216
Vadim » 29.10.2012 15:48:46
Rasmussen
Качали 32-ух битный FPC или 64-ёх битный?
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: Linux, runtime error 216
Rasmussen » 29.10.2012 22:51:40
Пробовал оба — оба кажут Runtime error 216 и, как я понял, адрес на сегмент оперативной памяти.
- Rasmussen
- новенький
- Сообщения: 13
- Зарегистрирован: 02.07.2012 21:33:54
Re: Linux, runtime error 216
Сквозняк » 02.11.2012 00:52:12
Если есть возможность, то надо собрать в другой системе бинарник с ключом -Xm и после выпадения ошибки 216 посмотреть по *.map файлу в какой процедуре случилась ошибка. В принципе нужно хакнуть файл Makefile и вписать туда опцию компилятора — очень удобная система сборки ![]()
- Сквозняк
- энтузиаст
- Сообщения: 1006
- Зарегистрирован: 29.06.2006 22:08:32
Вернуться в Free Pascal Compiler
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
program sortirovki;
{$s-}
{$r-}
type
list=^zveno;
zveno=record
c:byte;
next:list
end;
elem=record
sgn:boolean;
n:integer;
zero:boolean;
ch:list;
kz:integer
end;
structure=array [1..1500] of elem;
var
B:structure;
i,N,hs,M,l,prc,src,prh,srh,T:longint;
c:char;
p:list;
vsgn:boolean;
function compare(var x,y:elem):boolean; {true, esli x>y}
var px,py:list;
fl:boolean;
begin
if x.sgn <> y.sgn then
if x.sgn=false then compare:=true else compare:=false else
if x.n<>y.n then
if x.n < y.n then
if x.sgn=false then compare:=false else compare:=true else
if x.sgn=false then compare:=true else compare:=false else
begin
new(px);
new(py);
px:=x.ch;
py:=y.ch;
if x.ch^.c=0 then
begin
repeat
x.ch:=x.ch^.next;
until x.ch^.c<>0;
end;
if y.ch^.c=0 then
begin
repeat
y.ch:=y.ch^.next;
until y.ch^.c<>0;
end;
if x.ch^.c < y.ch^.c then fl:=false else fl:=true;
while (x.ch^.c = y.ch^.c) and (x.ch<>nil) and (y.ch<>nil) do
begin
x.ch:=x.ch^.next;
y.ch:=y.ch^.next;
if x.ch^.c < y.ch^.c then fl:=false else fl:=true;
end;
x.ch:=px;
y.ch:=py;
if (x.sgn=false) and fl then compare:=true else
if (x.sgn=false) and not fl then compare:=false else
if (x.sgn=true) and fl then compare:=false else compare:=true;
end;
srh:=srh+1;
src:=src+1;
end;
procedure swap(var x,y:elem);
var z:elem;
begin
new(z.ch);
z.n:=x.n;
z.kz:=x.kz;
z.sgn:=x.sgn;
z.zero:=x.zero;
z.ch:=x.ch;
x.n:=y.n;
x.kz:=y.kz;
x.sgn:=y.sgn;
x.zero:=y.zero;
x.ch:=y.ch;
y.n:=z.n;
y.kz:=z.kz;
y.sgn:=z.sgn;
y.zero:=z.zero;
y.ch:=z.ch;
prh:=prh+1;
prc:=prc+1;
end;
procedure heapify(var B:structure;j:integer);
var max:integer;
begin
if (2*j <= hs) and (not compare(B[j],B[2*j])) then max:=2*j else max:=j;
if (2*j+1 <= hs) and (not compare(B[max],B[2*j+1])) then max:=2*j+1;
if j <> max then begin
swap(B[j],B[max]);
heapify(B,max);
end
end;
procedure heapsort(var B:structure);
var i,l:integer;
begin
for i:=hs div 2 downto 1 do
heapify(B,i);
{for l:=1 to N do
write(a[l],’ ‘);}
for i:=hs downto 2 do
begin
swap(B[1],B[i]);
dec(hs);
heapify(B,1);
end;
end;
procedure chsort(var B:structure);
var i,j:integer;
begin
i:=1;
while i<N do
begin
if compare(B[i],B[i+1]) then
begin
j:=i;
while (not compare(B[j+1],B[j])) and (j <> 0) do
begin
swap(B[j],B[j+1]);
dec(j);
end;
inc(i);
end else inc(i);
end;
end;
function vvod(var B:structure):string;
var s:char;
fl:boolean;
i:integer;
p:list;
cp:boolean;
begin
i:=0;
repeat
inc(i);
fl:=true;
read(s);
if (s<>’ ‘) and (s<>’.’) then
begin
if s=’-‘ then begin read(s);B[i].sgn:=true; end else B[i].sgn:=false;
if (s=’0′) and fl then B[i].kz:=B[i].kz+1 else
begin
B[i].n:=B[i].n+1;
fl:=false
end;
if s<>’0′ then B[i].zero:=false else B[i].zero:=true;
new(B[i].ch);
B[i].ch^.c:=ord(s)-ord(‘0’);
B[i].ch^.next:=nil;
new(p);
p:=B[i].ch;
repeat
read(s);
if (s<>’ ‘) and (s<>’.’) then
begin
if s=’0′ then B[i].zero:=B[i].zero and true else B[i].zero:=false;
if (s=’0′) and fl then B[i].kz:=B[i].kz+1
else
begin
B[i].n:=B[i].n+1;
fl:=false
end;
new(B[i].ch^.next);
B[i].ch:=B[i].ch^.next;
B[i].ch^.c:=ord(s)-ord(‘0’);
B[i].ch^.next:=nil
end;
until (s=’ ‘) or (s=’.’);
B[i].ch:=p;
T:=T+1;
end;
until (s=’.’);
vvod:=»;
end;
begin
T:=0;
assign(input,’input.txt’);
assign(output,’output.txt’);
reset(input);
rewrite(output);
src:=0;
prc:=0;
srh:=0;
prh:=0;{
writeln(‘Vvedite razmer massiva’);
read(N);
writeln(‘Vvedite elementi massiva’);
for i:=1 to N do
begin
read(x[i]);
y[i]:=x[i];
end;
chsort(x);
writeln;}
{
writeln(‘Kolichestvo sravnenii i prisvaivanii dlya chelnok ‘,src,’ ‘,prc);
writeln(‘Kolichestvo sravnenii i prisvaivanii dlya heapsort ‘,srh,’ ‘,prh);
writeln(‘Rezultati sortirovki: 1)chelnok for X, 2)heapsort for Y’);
for i:=1 to N do
write(x[i],’ ‘);
writeln;
for i:=1 to N do
write(y[i],’ ‘); }
{probi vivoda}
vvod(B);
hs:=T;
N:=T;
heapsort(B);
{chsort(B);}
{writeln(prh,’ ‘,srh);}
{writeln(B[1].ch^.c);}
{writeln(compare(B[1],B[2]));}
{writeln(B[1].n,’ ‘,B[2].n);}
{writeln(B[1].ch^.next^.next^.c);}
{writeln(compare(B[1],B[3]));}
{writeln(T);}
for i:=1 to T do
begin
new(p);
p:=B[i].ch;
vsgn:=true;
while (B[i].ch<>nil) do
begin
if (B[i].sgn=true) and vsgn then begin vsgn:=false; write(‘-‘) end;
write(B[i].ch^.c);
B[i].ch:=B[i].ch^.next;
end;
write(‘ ‘);
B[i].ch:=p;
end;
{end probi}
readln;
readln;
close(input);
close(output);
end.
uses crt;
type
breed=(dog,pudel,bolonka,kolli,rotv);
gender=(f,m);
obj=record
p1:byte;
p2:breed;
p3:string[10];
p4:byte;
p5:gender;
p6:string[10];
end;
ff=file of obj;
mas=array[1..100] of ^obj;
var
f1:ff;
i,j,n,nh,nc:byte;
a,ah,am:mas;
dub:obj;
fl:boolean;
procedure input(var fx:ff; n:byte);
var
i,j:byte;
x:obj;
begin
reset(fx);
for j:=1 to n do
begin
with x do
begin
writeln('Type for ',j,' dog');
writeln('Type Club Number');
readln(p1);
writeln('Type breed: 0-Dog, 1-Pudel, 2-Bolonka, 3-Kolli, 4-Rotveiller');
readln(i);
p2:=breed(i);
writeln('Type Name');
readln(p3);
writeln('Type age');
readln(p4);
writeln('Type gender 0-f,1-m');
readln(i);
p5:=gender(i);
writeln('Type owner"s Surname');
readln(p6);
end;
write(fx,x);
end;
end;
procedure output(var x:mas;n:byte);
var i:byte;
begin
for i:=1 to n do
with x[i]^ do
begin
writeln;
writeln('DATA for ',i,' dog');
write('Club Number: ');
write(p1,'; ');
write('Breed: ');
case p2 of
dog:write('Dog');
pudel:write('Pudel');
bolonka:write('Bolonka');
kolli:write('Kolli');
rotv:write('Rotveiller');
end;
write('; ');
write('Name: ');
write(p3,'; ');
write('Age: ');
write(p4,'; ');
write('Gender: ');
case p5 of
m:write('male; ');
f:write('female; ');
end;
write('Owner"s Surname: ');
write(p6);
end;
end;begin
{$R-}
assign(f1, 'D:11-2dogs.pas');
rewrite(f1);
writeln('Type Number of Dogs');
readln(n);
input(f1,n);
reset(f1);
for i:=1 to n do
begin
new (a[i]);
read(f1,dub);
a[i]^:=dub;
end;
nh:=round(n/2);
for i:=1 to nh do
ah[i]:=a[i];
writeln(nh);
writeln('Type new elements count');
readln(nc);
writeln(nc);
for i:=(1) to (nc) do
begin
with ah[nh+i]^ do
begin
writeln('Type for new ',(i),' dog');
writeln('Type Club Number');
readln(p1);writeln('Type breed: 0-Dog, 1-Pudel, 2-Bolonka, 3-Kolli, 4-Rotveiller');
readln(j);
p2:=breed(j);
writeln('Type Name');
readln(p3);
writeln('Type age');
readln(p4);
writeln('Type gender 0-f,1-m');
readln(j);
p5:=gender(j);
writeln('Type owner"s Surname');
readln(p6);
end;
end;{1_s}
fl:=true;
while fl=true do
begin
fl:=false;
for i:=1 to n do
if (a[i]^.p4)>(a[i+1]^.p4) then
begin
dub:=a[i]^;
a[i]^:=a[i+1]^;
a[i+1]^:=dub;
fl:=true;
end;
end;
{2_s}
fl:=true;
while fl=true do
begin
fl:=false;
for i:=1 to (nh+nc) do
if (ah[i]^.p1)<(ah[i+1]^.p1) then
begin
dub:=ah[i]^;
ah[i]^:=ah[i+1]^;
ah[i+1]^:=dub;
fl:=true;
end;
end;clrscr;
output(a,n);
writeln;
output(ah,(nc+nh));
writeln;{$R+}
end.
вылетает с ошибкой 216 после 108 строчки
Код
writeln(nc);
Что делать?
Здравствуйте, помогите решить проблему, пожалуйста.
Вроде бы всё нормально должно работать, за пределы массива не выхожу. На выходе даёт 216 ошибку.
Юнит
unit matrix;
interface
uses crt;
type
TInt = integer;
TLInt = longint;
TSingle = single;
TElem = TSingle;
TLine = array [1..1] of TElem;
PLine = ^TLine;
TCol = array [1..1] of PLine;
PCol = ^TCol;
PCmatr = ^Cmatr;
Cmatr = object
private
Fstr:word;
Fstc:word;
FMatr:PCol;
procedure F(err:byte);
public
constructor CreateMatr(w,h:TInt); //выделение памяти под матрицу
destructor done(); //уничтожение матрицы, освобождение памяти
procedure putElem(i,j:word; elem:TElem);
procedure getElem(i,j:word; var e:TElem);
function getstr:word;
function getstc:word;
end;
implementation
{$R-}
function Cmatr.getstr:word;
begin
getstr:=Fstr;
end;
function Cmatr.getstc:word;
begin
getstc:=Fstc;
end;
procedure Cmatr.F(err:byte);
begin
case err of
1 : writeln('Ошибка выделения памяти');
end;
end;
constructor Cmatr.CreateMatr(w,h:TInt);
var i:TLint;
begin
Fstr:=w;
Fstc:=h;
getmem(FMatr, Fstr * sizeof(PLine)); //выделение памяти под строки
if Fmatr <> NIL then
begin
for i:=1 to Fstr do
begin
getmem(FMatr^[i], Fstc * sizeof(TElem));//под столбцы
writeln('память ',i);
delay(1000);
if Fmatr^[i] = NIL then
begin
F(1);
delay(2000);
halt(1);
end;
end;
end
else
begin
F(1);
delay(2000);
halt(1);
end;
end;
destructor Cmatr.done();
var i:TInt;
begin
for i:=1 to Fstr do
begin
freemem(Fmatr^[i],Fstc * sizeof(TElem));
end;
freemem(Fmatr, Fstr * sizeof(PLine));
end;
procedure Cmatr.putElem (i,j:word; elem:TElem);
begin
Fmatr^[i]^[j]:=elem;
end;
procedure Cmatr.getElem (i,j:word; var e:Telem);
begin
e:=Fmatr^[i]^[j];
end;
end.
program cursortest;
uses crt,matrix;
type
TChar = char;
TInt = integer;
TDouble = double;
const h = 10; w = 10;
var ch:char;
x,y,i,j,k,l:integer;
FMatr:PCmatr;
// Matr:Cmatr;
procedure cursor(var x,y:integer);
begin
gotoxy(x,y);
write('->');
end;
procedure moving(var x,y,k,l:TInt; ch:TChar);
begin
// ch:=readkey;
gotoxy(x,y);
textcolor(black);
write('->');
textcolor(white);
case ch of
'w', 'W', 'Ц' , 'ц' , #72: if (y>1) then begin y:=y-1; l:=l-1; end;
's', 'S', 'Ы' , 'ы' , #80: if (y<40) and (l<w) then begin y:=y+1; l:=l+1; end;
'a', 'A', 'Ф' , 'ф' , #75: if (x>5) then begin x:=x-5; k:=k-1; end;
'd', 'D', 'В', 'в' , #77: if (x<115) and (k<h) then begin x:=x+5; k:=k+1; end;
end;
end;
procedure fillArr (var FMatr:PCmatr) ;
var n,m,i,j:TInt;
eleme:TElem;
begin
randomize;
clrscr;
writeln('Введите размеры матрицы');
read(n,m);
FMatr^.createMatr(n,m);
for i:=1 to n do
begin
for j:=1 to m do begin
eleme:=(random(1000)/(random(100)+1));
write('Присвоил элемент');
delay(1000);
FMatr^.putElem(i,j,eleme);
write('Закинул в массив');
delay(1000);
end;
end;
end;
procedure printArr ();
var i,j:TInt;
el:TElem;
begin
gotoxy(1,1);
for i:=1 to FMatr^.getStr() do
begin
for j:=1 to FMatr^.getStc() do
begin
FMatr^.getElem(i,j,el);
write(el:5:0, ' ');
end;
writeln;
end;
end;
procedure changeElem(var FMatr:PCMatr; l,k:TInt);
var el:single;
begin
if ch = ' ' then begin
read(el);
FMatr^.putElem(l,k,el);
end;
end;
begin
clrscr;
write(1);
delay(2222);
fillArr(FMatr);
write(2);
delay(2222);
gotoxy(1,1);
write('#');
cursoroff;
x:=1; y:=1;
k:=1; l:=1;
while not (ch=#27) do begin
printArr();
cursor(x,y);
gotoxy(5,30);
write(l:3,k:3);
ch:=readkey;
moving(x,y,k,l,ch);
changeElem(FMatr,l,k);
delay(20);
end;
FMatr^.done();
end.
Программа вылетает на моменте, когда идёт заполнение матрицы. Она начинает присваивать первый элемент и ломается.
На данный момент всё, что должна делать программа — создавать массив с рандомными значениями, бегать по нему курсором и заменять элементы.