Форум программистов, компьютерный форум CyberForum.ru

Segmentation fault (core dumped) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.86
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
15.03.2013, 14:03     Segmentation fault (core dumped) #1
Доброго времени суток. Задача примерно такая. Сделать структуру с данными, класс List для управления в динамике этой структурой и класс с методами для ввода вывода данных в структуре. А проблема вот в чем, запускаю программу с помощью GNU c++ compiler и он начинает ругаться на первом введенном значении, а именно:
Segmentation fault (core dumped)
------------------
(program exited with code: 139)
Press return to continue
Как я понимаю, это указывает на то, что я пытаюсь обратиться к не выделенной области памяти. Но память вроде выделяется...в общем я запутался, помогите пожалуйста исправить программу и укажите на ошибку.
Спасибо.
Вот исходный код.
C++
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
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
struct Data {
  unsigned int day;
  unsigned int month;
  unsigned int year;
};
 
class List{
  public:
    Data *data;
    List *next;
};
 
List *begin;
List *current;
 
class inout{
  public:
    int ch;
    inout();
    void input();
    void output();
    ~inout();
};
 
 
inout::inout() {
begin=NULL;
ch=0;
while(ch!=1) input();
output();
};
 
void inout::input() {
  cout<<"enter data"<<endl;
  current=new List;
  if(begin==NULL) current=new List;
    else {current->next=new List; current=current->next;}
  current->next=NULL;
  cin>>current->data->day;
  cin>>current->data->month;
  cin>>current->data->year;
  if(begin==NULL) begin=current;
  cout<<"To finish entering data, press 1";
  cin>>ch;
 
};
 
void inout::output() {
  current=begin;
  do {
    cout<<current->data->day<<".";
    cout<<current->data->month<<".";
    cout<<current->data->year;
    cout<<endl;
    current=current->next;
  } while (current!=NULL);
};
 
inout::~inout(){
  while(begin){
    current=begin;
    begin=current->next;
    delete current;
  }
  delete begin;
};
 
int main () {
  inout obj;
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 14:03     Segmentation fault (core dumped)
Посмотрите здесь:

C++ Segmentation fault :(
C++ string segmentation fault
C++ Segmentation fault
Segmentation fault (iterator) C++
C++ Segmentation fault
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 14:10     Segmentation fault (core dumped) #2
под указатели next память, смотрю, во всю выделяется и даже удаляется когда надо.
Цитата Сообщение от art3330 Посмотреть сообщение
C++
1
2
3
4
5
class List{
  public:
   Data *data;
   List *next;
};
под next память, смотрю, во всю выделяется и даже удаляется когда надо.
А где хоть одна строчка data=new Data???
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.03.2013, 02:53  [ТС]     Segmentation fault (core dumped) #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
под указатели next память, смотрю, во всю выделяется и даже удаляется когда надо.
под next память, смотрю, во всю выделяется и даже удаляется когда надо.
А где хоть одна строчка data=new Data???
Ага. А в какой части кода мы должны выделить память? Просто если выделять, там же где выделяется и для next, до выдает ошибку, что нет декларации «data» в этой области видимости.

Добавлено через 20 часов 16 минут
Так все-таки. Где надо выделить память под Data? Я уже где только не пытался это сделать.

Добавлено через 29 минут
Мы должны память под Data в конструкторе List выделять, так? Нету под рукой пк, чтобы проверить, но я вроде понял.

Добавлено через 8 часов 58 минут
Ну так все таки. Как делать?

Добавлено через 5 часов 9 минут
Пробовал запихнуть выделение памяти в конструктор List, все равно не то. Подскажите, пожалуйста, как сделать.

Добавлено через 1 час 43 минуты
Где я только не пробовал выделять память под дата, либо пишет:
lab1.cpp:45:3: ошибка: нет декларации «data» в этой области видимости
либо
lab1.cpp:45:9: предупреждение: неиспользуемая переменная «data» [-Wunused-variable]
Укажите как сделать правильно.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.03.2013, 03:33     Segmentation fault (core dumped) #4
C++
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
#include <iostream>
 
using namespace std;
 
 
struct Date
{
  unsigned int day;
  unsigned int month;
  unsigned int year;
 
  Date()
      : day(0), month(0), year(0)
  {
  }
 
  Date(int d, int m, int y)
      : day(d), month(m), year(y)
  {
  }
};
 
ostream& operator << (ostream& out, const Date& date)
{
    out << date.day << '.' << date.month << '.' << date.year;
    return out;
}
 
 
struct Node
{
    Date  date;
    Node* next;
 
    Node()
        : next(0)
    {
    }
 
    Node(const Date& aDate)
        : date(aDate), next(0)
    {
    }
};
 
 
class List
{
    Node* m_head;
    Node* m_tail;
 
public:
    List()
        : m_head(0)
        , m_tail(0)
    {
    }
 
    ~List()
    {
        Node* node = m_head;
        while (node != 0)
        {
            Node* tmp = node->next;
            delete node;
            node = tmp;
        }
    }
 
    void add(const Date& date)
    {
        if (m_tail == 0)
        {
            m_head = new Node(date);
            m_tail = m_head;
        }
        else
        {
            m_tail->next = new Node(date);
            m_tail = m_tail->next;
        }
    }
 
    void print(ostream& out) const
    {
        Node* node = m_head;
        while (node != 0)
        {
            out << node->date << endl;
            node = node->next;
        }
    }
 
private:
    List(const List&);
    List& operator = (const List&);
};
 
int main ()
{
 
    List lst;
    lst.add(Date(1, 1, 2013));
    lst.add(Date(2, 1, 2013));
    lst.add(Date(3, 1, 2013));
    lst.add(Date(4, 2, 2013));
 
    lst.print(cout);
 
    return 0;
}
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.03.2013, 20:54  [ТС]     Segmentation fault (core dumped) #5
Как-то очень запутанно. И вроде не очень соответствует заданию. Можно как-нибудь модифицировать мою программу? Но все равно спасибо большое за помощь =)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.03.2013, 20:59     Segmentation fault (core dumped) #6
несоответсвие только в том, что вместо ввода дат с клавиатуры они явно втыкаются в список. в остальном - простейшая реализация односвязного списка. Где вы там умудрились запутаться я не знаю.
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.03.2013, 21:14  [ТС]     Segmentation fault (core dumped) #7
Цитата Сообщение от DU Посмотреть сообщение
несоответствие только в том, что вместо ввода дат с клавиатуры они явно втыкаются в список. в остальном - простейшая реализация односвязного списка. Где вы там умудрились запутаться я не знаю.
Просто немного не ясна вот эта часть
C++
1
2
3
4
5
ostream& operator << (ostream& out, const Date& date)
{
    out << date.day << '.' << date.month << '.' << date.year;
    return out;
}

Потом про структуру Node

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Node
{
    Date  date;
    Node* next;
 
    Node()
        : next(0)
    {
    }
 
    Node(const Date& aDate)
        : date(aDate), next(0)
    {
    }
};
Также что мы храним в private класса list и для чего нужны эти поля.

C++
1
2
3
4
private:
    List(const List&);
    List& operator = (const List&);
};
Если бы Вы смогли мне помочь я был бы очень Вам благодарен.
Заранее говорю спасибо. =)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.03.2013, 21:21     Segmentation fault (core dumped) #8
C++
1
2
3
4
5
6
7
8
9
10
11
ostream& operator << (ostream& out, const Date& date)
//это перегрузка оператора <<
//за счет этой перегрузки можно писать так:
Date date;
std::cout << date << std::endl;
// используется в строчке 90 исходного примера.
//у вас же явно все поля на вывод уходят, что несколько многословнее:
 cout<<date->day<<".";
 cout<<date->month<<".";
 cout<<date->year;
 cout<<endl;
struct Node - ну это узел списка. содержит поле с данными и указатель на следующий узел. список ведь из узлов состоит.



C++
1
2
3
private:
    List(const List&);
    List& operator = (const List&);
это не реализованные конструктор копирования и оператор присваивания. их или нужно вот так запрещать,
или реализовывать по нормальному. если так не сделать, то компилятор сгенерит дефолтные, а они неверные.
следующий код скомпилится, но будет приводить к крашам:
C++
1
2
3
4
5
List lst1;
lst1.add(Date(1, 2, 3));
List lst2 = list1; // отсюда начнутся проблемы
List lst3;
lst3 = lst2; // этот код тоже приведет к проблемам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 21:28     Segmentation fault (core dumped)
Еще ссылки по теме:

Segmentation fault C++
C++ Ошибка Segmentation fault
Segmentation fault C++

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

Или воспользуйтесь поиском по форуму:
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
17.03.2013, 21:28  [ТС]     Segmentation fault (core dumped) #9
DU, большое спасибо =) Все понятно =)
Yandex
Объявления
17.03.2013, 21:28     Segmentation fault (core dumped)
Ответ Создать тему
Опции темы

Текущее время: 02:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru