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.

Объяснение кода листинга программы

  1. Объявлены две переменные типа Integer i и j, которые будут использоваться для индексации массива.
  2. Выводится запрос на ввод размеров массива.
  3. Используя функцию SetLength, создается массив a заданного размера.
  4. В цикле заполняются все элементы массива a случайными числами от 0 до 100.
  5. В цикле выводятся все элементы массива a на экран, каждый элемент выводится в отдельной строке.
  6. Запрашивается ввод для завершения программы.

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

Оцени полезность:

8   голосов , оценка 4.625 из 5