Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 2
1

Exitcode 216. Не могу понять из-за чего

17.04.2016, 16:22. Показов 4285. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите решить проблему, пожалуйста.
Вроде бы всё нормально должно работать, за пределы массива не выхожу. На выходе даёт 216 ошибку.

Юнит
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  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.


Сама программа
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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.


Программа вылетает на моменте, когда идёт заполнение матрицы. Она начинает присваивать первый элемент и ломается.
На данный момент всё, что должна делать программа - создавать массив с рандомными значениями, бегать по нему курсором и заменять элементы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2016, 16:22
Ответы с готовыми решениями:

Ошибка exitcode 216
Как исправить, все вроде по методичке type point=^spisok; spisok = record fam: string;...

Exited with exitcode 216
Произвожу сдвиг значений элементов массива. При компиляции выдаёт ошибку Exited with exitcode 216 и...

Ошибка exitcode 201 Freepascal. Не могу понять что не так
В джине программа работает отлично, а на фри паскале выдает такую ошибку при запуске. Компилятор...

Exitcode=216 при использовании функции Loader
Хотел вставить рисунок в программу, на других получалось, здесь точно так же текст составлен + ещё...

4
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
17.04.2016, 16:38 2
Пока попробуй пошаговую отладку - хоть узнаешь, на какой строке возникает ошибка. А потом, посмотри значение переменных из этой строки в окне Watch.
Как пользоваться отладчиком
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 2
17.04.2016, 17:17  [ТС] 3
Пишет, что ошибка сегментации. Указывает на строку
Pascal
1
Fmatr^[i]^[j]:=elem;
в процедуре
Pascal
1
2
3
4
 procedure Cmatr.putElem (i,j:word; elem:TElem);
            begin
             Fmatr^[i]^[j]:=elem;
            end;
Добавлено через 21 минуту
Изменил тип массива в основной программе на Cmatr и убрал в ней все указатели на массив. Теперь всё работает.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
17.04.2016, 17:24 4
Возьмите в качестве отправной точки:
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit matrix;
interface
type
  TElement=Single;
  PRow = ^TRow;
  TRow = array [1..1] of TElement;
  PRows = ^TRows;
  TRows = array [1..1] of PRow;
  PMatrix = ^TMatrix;
  TMatrix = object
  private
    fData: PRows;
    fRows, fCols: Word;
  public
    constructor Init(aRows, aCols: Word);
    destructor  Done;
    procedure   SetEl(i, j: Word; e: TElement);
    function    GetEl(i, j: Word): TElement;
    function    Rows: Word;
    function    Cols: Word;
  end;
implementation
 
constructor TMatrix.Init(aRows, aCols: Word);
begin
  fRows:=aRows; fCols:=aCols;
  GetMem(fData,SizeOf(PRow)*fRows);
  for aRows:=1 to aRows do GetMem(fData^[aRows],SizeOf(TElement)*fCols);
end;
 
destructor  TMatrix.Done;
var i: Word;
begin
  for i:=1 to fRows do FreeMem(fData^[i],SizeOf(TElement)*fCols);
  FreeMem(fData,SizeOf(PRow)*fRows);
end;
 
procedure   TMatrix.SetEl(i, j: Word; e: TElement);
begin
  fData^[i]^[j]:=e;
end;
 
function    TMatrix.GetEl(i, j: Word): TElement;
begin
  GetEl:=fData^[i]^[j];
end;
 
function    TMatrix.Rows: Word;
begin
  Rows:=fRows;
end;
 
function    TMatrix.Cols: Word;
begin
  Cols:=fCols;
end;
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uses Matrix;
var
  p: PMatrix;
  i, j: Integer;
begin
  Write('M, N: '); ReadLn(i,j);
  p:=New(PMatrix,Init(i,j));
  with p^ do begin
    for i:=1 to Rows do for j:=1 to Cols do SetEl(i,j,Random*100);
    for i:=1 to Rows do begin
      for j:=1 to Cols do Write(GetEl(i,j):8:2); WriteLn;
    end;
  end;
  Dispose(p,Done);
  ReadLn;
end.
Обратите внимание на создание/разрушение объекта.

Обратите внимание на то, что FreePascal поддерживает встроенные динамические массивы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
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.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
17.04.2016, 17:29 5
Там какая-то ошибка с выделением памяти:
- в program переменная FMatr - указатель на объект. Но под сам объект место не выделяется - чтобы Fmatr^ указывало на что-то осмысленное.
0
17.04.2016, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2016, 17:29
Помогаю со студенческими работами здесь

При вводе значения в программу возникает ошибка exitcode=216
есть программа, при вводе значения в программу она завершает свое действие и появляется окошко...

Не могу понять, из-за чего сбои
Добрый день. Последнее время наблюдаю очень много сбоев в основном на Галакси Табах и старых...

Не могу понять с чего начать
Написать программу содержащую 2 функции. Первая функция которая выводит на экран строку,...

Не могу понять из-за чего фризы. =_=
Извиняюсь за некорректность темы,ибо не нашел точной темы для этого вопроса. Собрав сборку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru