Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
1

Segmentation fault

07.02.2015, 21:31. Показов 1559. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Есть 2 класса.
object
C++
1
2
3
4
5
6
7
8
9
10
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
Имеет 2 метода. Первый записывает указатель на функцию, второй вызывает функцию по указателю.
Objects
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
Имеет тоже 2 метода. Первый записывает адресс обекта в массив, второй вызывает метод call у всех обектов адресса которых записаны в массив.
Код целиком:
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
#include <iostream>
using namespace std;
 
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
 
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
 
void out(object *o){
    cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size<<endl;
    Main.callFuncs();
    return 0;
}
Если в цикле поставить число меньше 5(4 например) то ошибка не возникает.
Вопрос:
Почему возникает ошибка?
Как исправить?
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2015, 21:31
Ответы с готовыми решениями:

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы strcmp, strcpy. выводит...

Segmentation fault
Кусок кода: template &lt;typename Type&gt; class Queue { private: struct Elem ...

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str......

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw...

8
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 21:46 2
Для начала. Создали массив размером ноль элементов.
Цитата Сообщение от YR17 Посмотреть сообщение
size = 0;
mass = new object*[size];
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.02.2015, 21:46 3
C++
1
2
        size = 0;
        mass = new object*[size];
Ошибка тут.
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 21:54  [ТС] 4
А как правильно?
size инкремируется при добавлении елемента
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:01 5
но массив не увеличивается. Или реаллокацию делайте или на вектор замените массив.
или статический массив указателей используйте.
C++
1
object *mass[100];
1
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 22:05  [ТС] 6
Можно пример реаллокации?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2015, 22:12 7
Лучший ответ Сообщение было отмечено YR17 как решение

Решение

да вы замучаетесь, доводя это до рабочего варианта. конструкторы копий еще надо, деструктор, оператор =. и все это есть в std::vector. найдите список его методов и пользуйтесь. он уже все реаллоцирует что надо и удаляет и копирует.

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
#include <iostream>
#include <vector>
 
using namespace std;
 
class object
{
  void (*f)(object*);
public:
  void setFunc(void (*func)(object*))
  {
    f = func;
  }
 
  void callFunc()
  {
    f(this);
  }
};
 
class Objects
{
  std::vector<object*> mass;
 
public:
  unsigned size() const
  {
    return mass.size();
  }
 
  void addObject(object *obj)
  {
    mass.push_back(obj);
  }
 
  void callFuncs() const
  {
    for (auto obj : mass)
    {
      obj->callFunc();
    }
  }
};
 
void out(object *o)
{
  cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size()<<endl;
    Main.callFuncs();
    return 0;
}
0
Заблокирован
07.02.2015, 22:14 8
YR17, лучше добавьте поле capacity, которое будет отвечать за максимальное число элементов в контейнере.
C++
1
2
3
size = 0;
capacity = 100;
mass = new object* [ capacity ];
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:25 9
Цитата Сообщение от YR17 Посмотреть сообщение
Можно пример реаллокации?
что то типа этого, но лучше так не делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void Realloc(size_t newsize)
    {
        object **newmass = new object *[newsize];
        for (size_t i = 0; i < size; i++)
        {
            newmass[i] = mass[i];
        }
        size = newsize;
        delete[] mass;
        mass = newmass;
    }
    void addObject(object *ob)
    {
        Realloc(size + 1);
        mass[size - 1] = ob;
    }
0
07.02.2015, 22:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2015, 22:25
Помогаю со студенческими работами здесь

Segmentation fault
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL}; Пробую: char ** a; a...

Segmentation fault
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine,...

Segmentation fault
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача...

Segmentation fault :(
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{ int id; char name;...


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

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