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

External SIGSEGV при работе с указателями в классе

02.07.2018, 09:45. Показов 1132. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Lazarus. Имеется реализация списка.
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
105
106
107
108
109
110
111
112
113
114
unit classlist;
 
{$mode objfpc}{$H+}
 
interface
uses
  Classes, SysUtils;
type list_data = record
     data: integer;
     next: ^list_data;
end;
 
type
list = class
private
  first, last, newNode: ^list_data;
public
  constructor Create;
  procedure addHead(value: integer);
  procedure addTail(value: integer);
  function removeHead(var value: integer): boolean;
  function removeTail(var value: integer): boolean;
  function isEmpty(): boolean;
  procedure print();
end;
 
implementation
 
constructor list.Create;
begin
  inherited Create;
  first:=nil;
  last:=nil;
end;
 
procedure list.addHead(value: integer);
var newdata: ^list_data;
begin
  new(newdata);
  newdata^.data:=value;
  writeln(newdata^.data);
  newdata^.next:=nil;
  if isEmpty() then begin first:=newdata; last:=newdata end
  else begin newdata^.next:=first; first:=newdata; end;
end;
 
procedure list.addTail(value: integer);
var newdata: ^list_data;
begin
  new(newdata);
  newdata^.data:=value;
  newdata^.next:=nil;
  if isEmpty() then begin first:=newdata; last:=newdata end
  else begin last^.next:=newdata; last:=newdata; end;
end;
 
function list.removeHead(var value: integer): boolean;
var temp: ^list_data;
begin
  new(temp);
  if isEmpty()=true then removeHead:=false
  else begin
    temp:=first;
    if first=last then begin first:=nil; last:=nil end else first:=first^.next;
    value:=temp^.data;
    Dispose(temp);
    removeHead:=true;
  end;
end;
 
function list.removeTail(var value: integer): boolean;
var temp, curr: ^list_data;
begin
  new(temp);
  new(curr);
  if isEmpty()=true then removeTail:=false
  else begin
    temp:=last;
    if first=last then begin first:=nil; last:=nil end else
      begin
        curr:=first;
        while curr^.next<>last do curr:=curr^.next;
        last:=curr;
        curr^.next:=nil;
      end;
    value:=temp^.data;
    Dispose(temp);
    Dispose(curr);
  end;
  removeTail:=true;
end;
 
function list.isEmpty(): boolean;
begin
  if first=nil
  then isEmpty:=true
  else isEmpty:=false;
end;
 
procedure list.print();
var curr: ^list_data;
begin
  if isEmpty() then begin writeln('List is empty!'); exit; end;
  new(curr);
  curr:=first;
  writeln('List:');
  while curr<>nil do begin
    writeln(curr^.data);
    curr:=curr^.next;
  end;
  writeln();
end;
 
end.
Пытался запустить так
Pascal
1
2
3
4
5
6
7
8
9
10
11
program listtask;
 
uses classlist;
var ff: list;
begin
  ff.Create();
  writeln('Created');
  ff.addHead(5);
  writeln('Added');
  ff.print();
end.
Конструктор создает объект, но после этого любая попытка обратиться к first заканчивается вылетом с External SIGSEGV. В этом виде ошибка вылетает в момент, когда в методе addHead обращаюсь к isEmpty, при попытке сравнить first с nil. Пытался вставить операции с first в разные места метода addHead для теста, всегда один и тот же результат, при сравнении, присваивании, попытке распечатать адрес. Почитал на форуме темы с этой ошибкой, решения не нашел. пытался в конструкторе сделать так
Pascal
1
2
3
4
5
6
7
8
constructor list.Create;
var: a: ^list_data;
begin
  new(a)
  first:=a;
  last:=nil;
  inherited Create;
end;
но результат не изменился.
P.S. Про необходимость организовать деструктор знаю, просто пока не сделал, не могу сдвинуться с этой проблемы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2018, 09:45
Ответы с готовыми решениями:

Ошибка "External: SIGSEGV" в классе TControl
У меня при работе программы появляется ошибка. Что она означает?

External SIGSEGV при dbf1.open
При попытке открытия базы данных вызывает исключение SIGSEGV unit Unit1; {$mode objfpc}{$H+} ...

External: SIGSEGV при использовании Form.Show
Выдает ошибку, что проект вызвал класс исключения External: SIGSEGV в файле '.\include\control.inc'...

Исключение External SigSegv при попытке изменения компонента на другой форме
unit Unit2; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms,...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
02.07.2018, 09:54 2
Лучший ответ Сообщение было отмечено Dobbos как решение

Решение

Цитата Сообщение от Dobbos Посмотреть сообщение
Pascal
1
ff.Create();
- для Турбо-Паскаля. Нужно
Pascal
1
ff := List.Create;
1
1 / 1 / 1
Регистрация: 01.03.2012
Сообщений: 19
02.07.2018, 10:02  [ТС] 3
Отлично, это помогло! спасибо
0
02.07.2018, 10:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2018, 10:02
Помогаю со студенческими работами здесь

Ошибка "External: sigsegv" при нажатии на кнопку
Вылетает ошибка при нажатии на кнопку- класс исключения &quot;External: sigsegv&quot;. помогите пожалуйста...

External:SIGSEGV
Намучился с это программой, уже не знаю что делать. Помогите! Выдает ошибку External:SIGSEGV...

External: SIGSEGV
Я пишу программу, по обучению Английского и сперва хочу сделать алфавит с помощью массива из BitBtn...

External: SIGSEGV
Привет. Начал сейчас изучать классы, написал вроде как простейший класс, но на 10-й строке...


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

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