Exitcode 216. Не могу понять из-за чего - Free Pascal
Формулировка задачи:
Здравствуйте, помогите решить проблему, пожалуйста.
Вроде бы всё нормально должно работать, за пределы массива не выхожу. На выходе даёт 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.Решение задачи: «Exitcode 216. Не могу понять из-за чего»
textual
Листинг программы
var
a: array of array of Single;
i, j: Integer;
begin
Write('M, N: '); ReadLn(i,j);
SetLength(a,i,j);
for i:=0 to High(a) do for j:=0 to High(a[0]) do a[i,j]:=Random*100;
for i:=0 to High(a) do begin
for j:=0 to High(a[0]) do Write(a[i,j]:8:2); WriteLn;
end;
ReadLn;
end.
Объяснение кода листинга программы
- Объявлены две переменные типа Integer i и j, которые будут использоваться для индексации массива.
- Выводится запрос на ввод размеров массива.
- Используя функцию SetLength, создается массив a заданного размера.
- В цикле заполняются все элементы массива a случайными числами от 0 до 100.
- В цикле выводятся все элементы массива a на экран, каждый элемент выводится в отдельной строке.
- Запрашивается ввод для завершения программы.